python - 从子模块记录会忽略添加的根记录器流处理程序

标签 python logging

我的目标是将来自某个函数的日志消息重定向到一个文件中。这个函数是在另一个模块中定义的。我将 StreamHandler 添加到主记录器,但来自 child_call 函数的消息未按预期保存到 tmp.log

# main.py

import logging
import os
import sys
from child_logger import child_call

logging.basicConfig(format='%(name)s:%(filename)s:%(lineno)d:%(message)s', 
      level=logging.INFO, stream=sys.stdout)

logger = logging.getLogger(__name__)
logger.info('here it is')

with open('tmp.log', 'w') as f:
    logger_stream_handler = logging.StreamHandler(stream=f)
    logger_stream_handler.setLevel(logging.INFO)

    logger.addHandler(logger_stream_handler)
    logger.info('I am outer')
    child_call()
    logger.removeHandler(logger_stream_handler)


# child_logger.py

import logging
logger = logging.getLogger(__name__)

def child_call():
    logger.info('I am inner')

这是输出:

%python logger_test.py                                                
__main__:logger_test.py:18:here it is                                                                                                                                                
__main__:logger_test.py:25:I am outer                                                                                                                                          
child_logger:child_logger.py:9:I am inner

%cat tmp.log  
I am outer

我期待在 tmp.log 中看到“我是内在的”。据我了解日志记录模块,创建了一个 Logger 对象的层次结构,默认情况下来自子级的消息应该传播到根 Logger 并且根应该处理所有消息。我错过了什么?

最佳答案

问题是您的记录器没有正确链接。它们需要具有相同的根名称。例如:

# main.py
logger = logging.getLogger("parent")

# child_logger.py
logger = logging.getLogger("parent.child")

你的两个日志检索都只要求一个带有 __name__ 的记录器,它被设置为模块的名称,除了顶层,它得到“__main__”。你最终得到的是这样的:

# main.py
logger = logging.getLogger("__main__")

# child_logger.py
logger = logging.getLogger("child_logger")

您需要实现一个通用的父日志记录名称方案来创建正确的记录器继承层次结构。

关于python - 从子模块记录会忽略添加的根记录器流处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38087371/

相关文章:

c - 如何在c中读取内核日志消息?

python - 如何在 Mac OS 的 anaconda 中安装 caffe?

python - matplotlib - 保存没有背景和边框的绘图线和透明度 8 位 alpha channel 问题

Python 2.6.2,Django 1.0.3,Windows XP,找不到页面 :/

Python 事件循环 w/gevent

java - 将 System.out 和 System.err 重定向到 slf4j

python - 即使在 python 中提交交换函数后,列表仍然保持不变

ios - iOS 构建中未显示 Unity 调试日志

c# - 是否可以在 Serilog.Exceptions 中禁用基于反射的解构器?

php - Laravel 日志级别,有何不同?