在其他一些技术中,我们偶尔使用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)
虽然您可以添加自定义级别,但添加一些提供更精细控制级别的过滤器可能是更好的方法.
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)
| 归档时间: |
|
| 查看次数: |
7659 次 |
| 最近记录: |