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

Mat*_*und 17 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!")
Run Code Online (Sandbox Code Playgroud)

这在我在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!")
Run Code Online (Sandbox Code Playgroud)

EDIT3 - 弄清楚了......打电话给

logging.addLevelName(5,"VERBOSE")
Run Code Online (Sandbox Code Playgroud)

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

当然,日志语句本身并不完美,因为您调用:

self.logger.log(VERBOSE,"Something very spammy")
Run Code Online (Sandbox Code Playgroud)

而不是

self.logger.verbose("Something very spammy")
Run Code Online (Sandbox Code Playgroud)

但我真的不想修改任何记录器库代码(去过那里,完成了,有T恤).

谢谢大家!

对于那些认为不需要低于DEBUG的人来说,更多的力量给你:)

Ray*_*ger 16

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

您可以创建自定义级别(尽管文档说这很少是必要的,甚至可能是不合需要的).如果你想添加一个级别,技术很简单:

>>> logging.addLevelName(5, "VERBOSE")
Run Code Online (Sandbox Code Playgroud)

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

  • 你是对的,我需要的只是logging.addLevelName(5,"VERBOSE")调用.我只是不知道该把它放在哪里.在调用logging.config.dictConfig(...)之前放置它之后就可以了! (2认同)

Voi*_*ski 12

你甚至可以进一步添加一个logger.verbose方法,虽然我强烈建议你不要出于各种原因(在日志记录的方法中已经很多).无论如何,如果你确定你真的想要一个,这里是代码:

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


sle*_*cal 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)
Run Code Online (Sandbox Code Playgroud)

现在也可以使用;

logging.verbose(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)