在其他一些技术中,我们偶尔使用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的人来说,对你有更多的权力:)
答案 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)