Python日志 - 是否有低于DEBUG的等级?
在其他一些技术中,我们偶尔会使用一个低于DEBUG的日志级别,我记得它叫“详细模式”。我知道这种需求是很主观的。但在我看来,仅仅有INFO和DEBUG是不够的。有时候,我们需要记录一些非常频繁的信息(比DEBUG还要频繁),这时候就需要这个级别的日志。在实际操作中,我们通常会在没有开启这个日志级别的情况下生成构建版本,但在某些情况下,我们会在产品安装到某个质量保证环境后,追踪bug时开启这个日志级别。
有没有什么简单的方法可以使用标准的Python日志库记录低于DEBUG级别的日志呢?
在一个temp.py文件中,我可以这样做:
logging.addLevelName(5,"verbose")
VERBOSE = 5
logger = logging.getLogger("foo")
logger.setLevel(VERBOSE)
logger.log(VERBOSE,"blah!")
当我在我的IDE中运行temp.py时,这样是有效的(并且日志输出到标准输出),但我们的真实守护进程使用标准的文件/字典配置语法来设置日志,我没有看到有什么方法可以指示守护进程使用5级日志。
我是在追逐一些不太可行的东西吗?
对于那些可能想知道为什么我需要低于DEBUG的日志的人来说,这是因为有时候会有一些日志记录非常频繁(可能是在一个内部循环中),我通常不想在DEBUG级别看到这些,但在某些生产系统上,偶尔开启一次可能会有帮助,而不需要在源代码中添加更多的日志并重新部署等等。
编辑1 - 显然,日志库允许自定义级别。由于DEBUG是10级,所以在1到9的范围内还有空间。如果我定义一个自定义级别(就像上面的示例代码),我真正想问的是,如何从json日志配置文件中启用这个日志级别?
编辑2 - 如果不是因为我们需要使用json配置文件(这是我无法更改的要求),以下代码是可以工作的:
import logging
logging.basicConfig(filename='example.log',level=5)
VERBOSE = 5
logging.addLevelName(5,"verbose")
logger = logging.getLogger("bar")
logger.log(VERBOSE,"blah!")
编辑3 - 我搞定了... 调用
logging.addLevelName(5,"VERBOSE")
是关键。我只是在错误的位置调用了它。在我的情况下,我只需要确保上面的调用发生在调用日志库的dictConfig(...)之前。这样做后,我就能够进入我们的日志配置文件,将文件处理程序和根级别的日志级别都调低到VERBOSE,并且成功了。
当然,日志语句本身并不是特别优雅,因为你调用的是:
self.logger.log(VERBOSE,"Something very spammy")
而不是
self.logger.verbose("Something very spammy")
但我真的不想修改任何日志库的代码(我经历过,知道那是什么感觉)。
谢谢大家!
对于那些认为不需要低于DEBUG级别的人,祝你们好运 :)
4 个回答
@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)
你甚至可以进一步添加一个 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)
DEBUG 是日志模块提供的最低级别,其他级别有:('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
。它们的数值可以在这里查看:http://docs.python.org/howto/logging.html#logging-levels
你可以创建自定义级别(不过文档里说这种情况很少需要,甚至可能不太好)。如果你想添加一个级别,方法很简单:
>>> logging.addLevelName(5, "VERBOSE")
虽然你可以添加自定义级别,但更好的方法可能是添加一些过滤器,这样可以提供更细致的控制。