Python 日志记录 : How can I determine when a handler was added?

标签 python logging

有时,我有多个处理程序附加到给定的记录器,但我只想要一个,因为日志显示为重复行。

我想知道什么代码或模块实际添加了处理程序,以便我可以打开/关闭它们。

LogRecord 类有很多关于记录本身添加位置的信息,但是是否有关于何时添加处理程序的等效信息?

最佳答案

您可以对 Logger.addHandler 进行猴子修补方法,例如

def monkeypatch_logging():
    import logging
    add_handler_orig = logging.Logger.addHandler

    def _addHandler(self, hdlr):
        import traceback
        traceback.print_stack()
        add_handler_orig(self, hdlr)

    logging.Logger.addHandler = _addHandler

将代码放在入口点附近的某个位置,以便它足够早地运行,例如

if __name__ == '__main__':
    import logging
    monkeypatch_logging()
    logging.basicConfig(level=logging.INFO)
    logging.info('hello world')

将输出:

  File "spam.py", line 18, in <module>
    logging.basicConfig(level=logging.INFO)
  File "/usr/lib64/python3.6/logging/__init__.py", line 1823, in basicConfig
    root.addHandler(h)
  File "spam.py", line 10, in _addHandler
    traceback.print_stack()
INFO:root:hello world

堆栈跟踪将显示 Logger.addHandler 被调用的位置。

关于Python 日志记录 : How can I determine when a handler was added?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55926635/

相关文章:

python - Python/Django 中模型/对象实例的字符串字典表示?

python - 无法使用 openpyxl Workbook 将数据写入 Excel-Sheet

python - 带有 TF 后端的 Keras 指标与 tensorflow 指标

logging - 转换为 UI 的记录器条目停止随时间更新

linux - 在巨大的 gzip 文件顶部追加一行

ruby - 将线程 ID 添加到 ruby​​ 日志

python - 更改文件名?

python - 如何判断 undefined variable 是否在 Python 列表中?

haskell - 如何在不执行括号的情况下定义简单的 RIO LogFunc

java - 如何让 log4j2 使用 Spring Boot 和 Maven 创建不同的日志文件