Python日志-在DEBUG下面还有什么东西吗?

czfnxgou  于 2023-02-02  发布在  Python
关注(0)|答案(4)|浏览(111)

在其他一些技术中,我们偶尔会在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恤)。
谢谢大家!
而对于那些认为不需要比调试更低的东西的人,更多的权力给你:)

rpppsulh

rpppsulh1#

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

您可以创建自定义级别(尽管文档中说这应该很少是必要的,甚至可能是不受欢迎的)。如果您想添加一个级别,技术很简单:

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

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

thtygnil

thtygnil2#

您甚至可以进一步添加一个logger.verbose方法,尽管出于各种原因我强烈建议您不要这样做(日志的how-to中有很多介绍)。无论如何,如果您决定真的需要一个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)
gab6jxml

gab6jxml3#

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

aydmsdu94#

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

相关问题