Python日志记录 - 在DEBUG下面有什么东西吗?

Python日志记录 - 在DEBUG下面有什么东西吗?

问题描述:

在其他一些技术中,我们偶尔会使用低于DEBUG的日志级别,我相信这被称为“冗长”。我意识到这样一个级别的需求是非常主观的。但是在我看来,只有INFO和DEBUG是不够的。我们有时候需要记录非常垃圾的东西(比调试更垃圾)。实际上,我们会在没有打开的情况下生成内部版本,但在少数情况下,我们会在某些QA设置中安装产品并追踪错误等后启用此级别的日志记录。Python日志记录 - 在DEBUG下面有什么东西吗?

是否有任何使用标准的python日志库来记录DEBUG级别以下的东西(简单或其他方式)?

在temp.py文件,我可以做到以下几点:

logging.addLevelName(5,"verbose") 
VERBOSE = 5 

logger = logging.getLogger("foo") 
logger.setLevel(VERBOSE) 
logger.log(VERBOSE,"blah!") 

这工作,当我我的IDE中运行temp.py(和日志到标准输出),但我们真正的守护程序使用标准的文件/字典配置语法来设置日志记录,我没有看到任何方式表明守护程序应该使用5级。

我在追逐那些不可行的东西吗?

对于那些可能想知道为什么我需要比DEBUG更低的东西的人,偶尔会遇到偶尔出现的日志类型(可能是内部循环),即使在DEBUG中我通常也不会看到它。在某些生产系统上,可能会有一段时间启用它,而无需向源代码添加更多日志记录并重新部署等。

EDIT1 - 显然,日志记录库允许自定义级别。由于DEBUG是10级,因此1..9范围内有空间。如果我定义了自定义级别(例如上面的示例代码),我想我真正的问题是如何从json日志配置文件启用该级别的日志记录?

EDIT2 - 下,如果它是不是事实,我们需要/使用JSON配置文件(即我不能改变的要求)会工作:

import logging 

logging.basicConfig(filename='example.log',level=5) 
VERBOSE = 5 
logging.addLevelName(5,"verbose") 
logger = logging.getLogger("bar") 
logger.log(VERBOSE,"blah!") 

EDIT3 - 想通了...致电

logging.addLevelName(5,"VERBOSE") 

是至关重要的。我只是没有在正确的地方。在我的情况下,我只需要使上述调用之前调用日志库dictConfig(...)调用。当我这样做后,我就可以进入我们的日志配置文件,并将事件(在文件处理程序和根目录上)压缩到VERBOSE,并且它工作。

当然,因为你调用日志语句本身不完全是优雅:

self.logger.log(VERBOSE,"Something very spammy") 

而不是

self.logger.verbose("Something very spammy") 

但我真的不想修改任何记录库代码(被在那里,做到这一点,有T恤)。

谢谢大家!

对于那些谁觉得没什么低于需要DEBUG,更多的权力给你:)

+2

“......有助于一段时间......”听起来*完全*像'DEBUG'一样。 – 2012-01-28 04:35:55

+0

是的,其中一些归结为对DEBUG意味着什么与INFO等的主观解释。我不会将日志DEBUG语句放在可以执行数百次的内部循环中。但在过去的公司中,我偶尔会在这样一个循环中放入一个“详细”的日志语句。我理解你的观点。 – 2012-01-28 04:38:33

+1

ISTM日志记录的设计是将日志记录调用放在任何可能需要的地方,然后通过过滤器或报告一次设置来抑制高音量。 – 2012-01-28 04:45:54

DEBUG是最低级别了由日志模块提供的国家:('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')。他们的数值在这里:http://docs.python.org/howto/logging.html#logging-levels

您可以创建custom levels(虽然文档说这应该很少是必要的,甚至可能是不受欢迎的)。如果你想添加的水平,the technique很简单:

>>> logging.addLevelName(5, "VERBOSE") 

虽然你们可以添加自定义级别,它可能是一个更好的方法来添加一些过滤器提供更好的控制水平。

+1

这确实如此,但框架显然允许自定义级别。 DEBUG是10级,因此1..9之间仍然有一些空间:)我只是不确定如何使用这种自定义级别,以便可以从标准JSON日志记录设置文件启用。我想这真的是我的问题......其实我会编辑我的原始问题,指出这是我需要弄清的部分。 – 2012-01-28 04:39:56

+2

你说得对,我需要的只是logging.addLevelName(5,“VERBOSE”)调用。我只是不知道该把它放在哪里。将它放在logging.config.dictConfig(...)调用之前它工作! – 2012-01-28 06:01:40

你甚至可以走得更远,并添加一个logger.verbose方法,但我强烈建议你不要因为各种原因(几乎涵盖在logging's how-to)。无论如何,如果你决定,你真的想有一个,下面的代码:

logging.VERBOSE = 5 
logging.addLevelName(logging.VERBOSE, "VERBOSE") 
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs) 

答案从@voitek的伟大工程,但他忘了猴子补丁logging.verbose

logging.VERBOSE = 5 
logging.addLevelName(logging.VERBOSE, "VERBOSE") 
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs) 
logging.verbose = lambda msg, *args, **kwargs: logging.log(logging.VERBOSE, msg, *args, **kwargs) 

这现在也适用于;

logging.verbose(*args, **kwargs)