StreamHandler上的Python setLevel不起作用

时间:2012-01-10 20:13:27

标签: python logging

我按如下方式设置了日志记录:

def setUp():

    LOG_FORMAT = '%(asctime)s %(levelname)-8s %(name)s %(message)s'
    #LOG_FORMAT = '%(asctime)s %(name)s %(message)s'

    logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)
    formatter = logging.Formatter(LOG_FORMAT)

    ch = logging.StreamHandler()
    ch.setLevel(logging.ERROR)
    ch.setFormatter(formatter)
    logging.getLogger().addHandler(ch)

    LOG_FILENAME = 'file.log'
    fh = logging.FileHandler(LOG_FILENAME, 'w')
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    logging.getLogger().addHandler(fh)

但是,控制台仍会显示DEBUG条消息。我在这里错过了什么吗?

请注意,在ERROR上将级别设置为fh可以正常工作。

2 个答案:

答案 0 :(得分:2)

我认为您需要删除对logging.basicConfig的调用。该函数添加了另一个logging.StreamHandler,可能是打印您不想打印的邮件的那个。{/ p>

要检查这一点,您可以查看根记录器的handlers属性(它是包含所有处理程序的列表)并验证其中有多少logging.StreamHandlers。此外,由于两个logging.ERROR s,水平设置为logging.StreamHandler的消息可能会打印两次。

如果你要在代码中明确配置处理程序,我的最后建议是避免使用logging.basicConfig

编辑:为了完整起见,logging.BasicConfig的源代码如下:

if len(root.handlers) == 0:
    filename = kwargs.get("filename")
    if filename:
        mode = kwargs.get("filemode", 'a')
        hdlr = FileHandler(filename, mode)
    else:
        stream = kwargs.get("stream")
        hdlr = StreamHandler(stream)
    fs = kwargs.get("format", BASIC_FORMAT)
    dfs = kwargs.get("datefmt", None)
    fmt = Formatter(fs, dfs)
    hdlr.setFormatter(fmt)
    root.addHandler(hdlr)
    level = kwargs.get("level")
    if level is not None:
        root.setLevel(level)

您可以看到,除非filename通过,否则会创建logging.StreamHandler

答案 1 :(得分:2)

来自logging.basicConfig上的Python文档:

  

通过创建日志记录系统的基本配置   StreamHandler使用默认格式化程序并将其添加到根目录   记录器。

当您将根记录器的调试级别设置为logging.DEBUG并且您没有关闭转发消息到根记录器时,您的DEBUG消息会被basicConfig创建的此StreamHandler记录