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

Python 从子模块记录将忽略添加的根记录器流处理程序,python,logging,Python,Logging,我的目标是将日志消息从某个函数重定向到一个文件中。此函数在另一个模块中定义。我将StreamHandler添加到一个主记录器中,但来自child_调用函数的消息并没有按预期保存到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:%(messa

我的目标是将日志消息从某个函数重定向到一个文件中。此函数在另一个模块中定义。我将StreamHandler添加到一个主记录器中,但来自child_调用函数的消息并没有按预期保存到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中看到“我是内在的”。就我对日志模块的理解而言,创建的日志对象有一个层次结构,默认情况下,来自子日志的消息应该传播到根日志,根日志应该处理所有消息。我遗漏了什么?

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

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

# child_logger.py
logger = logging.getLogger("parent.child")
您的两次日志检索都要求使用
\uuuuuu name\uuuuu
的记录器,该记录器设置为模块名称,但顶层除外,顶层获取“\uuuu main\uuuu”。你最终得到的结果相当于:

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

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

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

谢谢!我认为日志记录会考虑模块层次结构,并在内部调整记录器名称以构建相应的层次结构。您知道如何强制child_logger使用我想要的处理程序吗?我无法更改第三方模块child_logger.py,同时我不希望在getLogger调用中显式使用模块名称。也许有一种方法可以得到一个包含所有可用记录器的iterable,然后为每个记录器分配一个处理程序?@SergiusBond不幸的是,我没有。仔细查看日志模块文档,了解可能对您有所帮助的功能。如果你找不到任何东西,考虑打开一个新问题(搜索重复之后)。