在其他一些技术中,我们偶尔会在DEBUG之下使用一个日志级别,我认为这被称为"冗长"。我意识到对这样一个级别的需求是非常主观的。但在我看来,"仅仅"拥有INFO和DEBUG是不够的。我们曾经有过一些非常垃圾的东西(比调试更垃圾)需要记录。实际上,我们会在没有打开此功能的情况下生成构建,但在少数情况下,我们会"d在产品全部安装在某个QA设置上之后,在跟踪bug等时启用此级别的日志记录。
是否有任何方法(简单或不简单)可以使用标准的python日志库记录DEBUG级别以下的内容?
在www.example.com文件中,我可以执行以下操作:temp.py file I can do the following:
logging.addLevelName(5,"verbose")
VERBOSE = 5
logger = logging.getLogger("foo")
logger.setLevel(VERBOSE)
logger.log(VERBOSE,"blah!")
当我在IDE中运行www.example.com(并记录到stdout)时,这是有效的,但我们真正的守护进程使用标准的文件/字典配置语法来设置日志记录,我看不到任何方法来指示应该为守护进程使用级别5。temp.py within my IDE (and logs to stdout) but our real daemons use the standard file/dictionary configuration syntax to setup logging and I don't see any way to indicate that level 5 should be used for the daemon.
我是不是在追求一些不可行的东西?
对于那些可能想知道为什么我需要比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,它工作了。
诚然,log语句本身并不优雅,因为您调用了:
self.logger.log(VERBOSE,"Something very spammy")
而不是
self.logger.verbose("Something very spammy")
但我真的不想修改任何日志库代码(去过那里,做过,有t恤)。
谢谢大家!
而对于那些认为不需要比调试更低的东西的人,更多的权力给你:)
4条答案
按热度按时间rpppsulh1#
('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
。它们的数值如下:http://docs.python.org/howto/logging.html#logging-levels您可以创建自定义级别(尽管文档中说这应该很少是必要的,甚至可能是不受欢迎的)。如果您想添加一个级别,技术很简单:
尽管可以添加自定义级别,但添加一些提供更精细控制级别的筛选器可能是更好的方法。
thtygnil2#
您甚至可以进一步添加一个
logger.verbose
方法,尽管出于各种原因我强烈建议您不要这样做(日志的how-to中有很多介绍)。无论如何,如果您决定真的需要一个logger.verbose
方法,下面是代码:gab6jxml3#
@voitek的答案工作得很好,但他忘了猴子补丁
logging.verbose
。这现在也将与;
aydmsdu94#
除了@sleepycal的答案之外,您可能还希望向LoggerAdapter添加一个详细的方法: