繁体   English   中英

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

[英]Logging from a child module ignores the added root logger stream handler

我的目标是将日志消息从特定功能重定向到文件中。 此功能在另一个模块中定义。 我将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,root应该处理所有消息。 我错过了什么?

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

# 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")

您需要强制执行公共父日志记录名称方案以创建正确的记录器继承层次结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM