无法使用python3.6中的日志记录模块在流处理程序上打印自定义日志级别

时间:2018-08-06 06:25:09

标签: python logging

下面是__init__.py文件中的函数,这意味着这部分代码始终在执行代码时运行

import logging
def log_setup():

    logging.TRACE = 5
    logging.addLevelName(5, 'TRACE')
    def trace(obj, message, *args, **kws):
        obj.log(logging.TRACE, message, *args, **kws)
    logging.Logger.trace = trace
    logging.trace = trace
    root = logging.getLogger("TEST")
    root.setLevel(5)
    ch = logging.StreamHandler()
    ch.setFormatter(f)
    ch.setLevel(5)
    root.handlers = []
    root.addHandler(ch)

我在其中一个库xyz.py中有以下代码

import logging
log = logging.getLogger("TEST."+__name__)
if log.trace:
    print("***ELLO***", log.getEffectiveLevel())
    print("***ELLO***", log.isEnabledFor(logging.DEBUG))
    print("***ELLO***", log.isEnabledFor(logging.TRACE))
    log.trace("Hey Statement printed")

通过脚本调用时,无法打印log.trace。有趣的是,对于log.isEnabledFor(logging.TRACE)始终返回False。

不确定我在这里缺少什么

下面是输出

***ELLO*** 10
***ELLO*** True
***ELLO*** False

2 个答案:

答案 0 :(得分:1)

除非您自己创建了自定义处理程序,否则python中没有TRACE日志级别

下面是日志级别列表

enter image description here

请在那里参考 https://docs.python.org/2/library/logging.html#levels

答案 1 :(得分:1)

您的代码无法运行:例如,将其粘贴到源文件中,由于f未定义,因此它失败。注释掉那条线,我可以毫无问题地运行它。您是否确定在log_setup()中的代码之前调用xyz?我的猜测是不是。另外,这行

root.handlers = []

不应该在那里-您不应该这样做,因为handlers是一个内部属性,并不意味着您可以直接进行更改。线

logging.trace = trace

看起来也是错误的,因为日志记录模块级的便捷功能不采用初始对象参数,而是具有诸如debug(msg, *args, **kwargs)之类的签名。大概您希望模块级trace函数具有类似的签名。