【问题标题】:Python 2 logger repeats lines after use of default loggerPython 2 记录器在使用默认记录器后重复行
【发布时间】:2017-11-22 16:50:42
【问题描述】:

我正在编写一段代码,它使用自己的处理程序和格式实例化自己的记录器。

现在我添加了一个库,它直接使用日志记录模块,它搞砸了我的记录器 - 原始记录器开始以不同格式打印每行两次,而默认记录器根本不打印任何内容。

有什么建议吗? MCVE:

import sys
import logging
log = logging.getLogger('foo')
log.addHandler(logging.StreamHandler(sys.stdout))
log.setLevel(logging.DEBUG)

log.info("works once")
logging.info("Isn't printed")
log.info("printed twice with different format")

输出:

works once
printed twice with different format
INFO:foo:printed twice with different format

默认记录器似乎也不会以某种方式向我的记录器实例添加额外的处理程序:

> print log.handlers
[<logging.StreamHandler object at 0x7f5d14314990>]

我无法更改已包含的模块...

【问题讨论】:

    标签: python python-2.7 logging


    【解决方案1】:

    挖了又挖,终于找到了一点救我的文档!

    Logger.propagate

    如果计算结果为 true,则记录到此的事件 logger 将被传递给更高级别的处理程序(祖先) 记录器,以及附加到此记录器的任何处理程序。留言 直接传递给祖先记录器的处理程序 - 既不是 考虑相关祖先记录器的级别或过滤器。

    如果计算结果为 false,则日志消息不会传递给 祖先记录器的处理程序。

    构造函数将此属性设置为 True。

    设置log.propagate = False结束了我的不幸。

    似乎通过logging.info 首次使用默认记录器已初始化默认记录器,并且从那一刻起传播开始产生影响。

    【讨论】:

    • 如果可以,请打开您使用的库的错误报告。库不应使用根记录器来满足其记录需求。它会导致您面临的问题。图书馆应创建自己的记录器 (getLogger()) 并在其上附加 NullHandler
    猜你喜欢
    • 1970-01-01
    • 2021-05-03
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多