我的目标是将日志消息从特定功能重定向到文件中 . 此功能在另一个模块中定义 . 我将StreamHandler添加到主 Logger ,但来自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应该处理所有消息 . 我错过了什么?
1 回答
问题是您的 Logger 没有正确链接 . 他们需要具有相同的根名称 . 例如:
这两个日志检索只需要一个带有
__name__
的 Logger ,该 Logger 设置为模块的名称,除了顶层,它得到"main" . 你最终得到的相当于:您需要强制执行公共父日志记录名称方案以创建正确的 Logger 继承层次结构 .