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

时间:2012-01-28 04:31:58

标签: python logging

在其他一些技术中,我们偶尔使用DEBUG以下的日志级别,我认为这个级别被称为“详细”。我意识到对这种水平的需求是非常主观的。但在我看来,“只是”拥有INFO和DEBUG还不够。我们有时需要记录一些非常垃圾邮件(比调试更垃圾邮件)。在实践中,我们会在没有打开的情况下生成构建版本,但在少数情况下,我们会在产品全部安装到某些QA设置之后启用此级别的日志记录,同时跟踪错误等。

有没有办法(简单或其他方式)使用标准的python日志库记录DEBUG级别以下的内容?

在temp.py文件中,我可以执行以下操作:

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

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

当我在IDE中运行temp.py(并记录到stdout)时,这是有效的,但是我们真正的守护进程使用标准文件/字典配置语法来设置日志记录,我没有看到任何方式来指示级别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的人来说,对你有更多的权力:)

4 个答案:

答案 0 :(得分:16)

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

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

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

尽管您可以添加自定义级别,但添加一些提供更精细控制级别的过滤器可能是更好的方法。

答案 1 :(得分:11)

你甚至可以进一步添加一个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)

答案 2 :(得分:10)

@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)

答案 3 :(得分:1)

除了@sleepycal的答案外,您可能还想向LoggerAdapter添加详细方法:

logging.VERBOSE = 5
logging.addLevelName(logging.VERBOSE, "VERBOSE")
logging.Logger.verbose = lambda inst, msg, *args, **kwargs: inst.log(logging.VERBOSE, msg, *args, **kwargs)
logging.LoggerAdapter.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)