gpt4 book ai didi

Python 根记录器消息未通过使用 fileConfig 配置的处理程序记录

转载 作者:行者123 更新时间:2023-11-30 23:10:02 25 4
gpt4 key购买 nike

问题:

给定日志记录配置和使用该配置的记录器,我可以看到来自配置日志处理程序的脚本的日志消息,但看不到来自分配了相同处理程序的根记录器的日志消息。

详细信息:

(使用Python 2.7)

我有一个模块my_mod,它实例化了一个记录器。 my_mod 有一个函数 my_command,它使用该记录器记录一些消息。 my_mod 存在于库 my_lib 内部,因此我不想使用任何处理程序配置记录器;根据建议,我想将日志处理留给使用 my_mod 的开发人员。 my_mod 看起来像:

import logging

LOGGER = logging.getLogger(__name__)

def my_command():
LOGGER.debug("This is a log message from module.py")
print "This is a print statement from module.py"

我还有一个 python 脚本 my_script.py,它使用 my_mod.my_commandmy_script.py 实例化一个记录器,在本例中,我确实配置了处理程序和格式化程序。 my_script.py 使用 fileConfig 和与 my_script.py 一起存在的配置文件来配置处理程序和格式化程序:

import os
import logging
import logging.config
from my_mod.module import my_command

logging.config.fileConfig('{0}/logging.cfg'.format(
os.path.dirname(os.path.realpath(__file__))))
LOGGER = logging.getLogger(__name__)

LOGGER.debug("This is a log message from script.py")
my_command()

据我所知,我的配置文件似乎设置正确......

[loggers]
keys=root,script

[handlers]
keys=consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_script]
level=DEBUG
handlers=consoleHandler
qualname=script
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format=%(asctime)s [%(levelname)s] %(name)s: %(message)s
datefmt=

...但是当我运行 my_script.py 时,我只得到 my_script.py 中的日志行,而不是 my_mod.my_command< 中的日志行。不过,我知道 my_command 正在工作,因为调试日志语句成功打印到控制台后 my_command 中的打印语句:

20:27 $ python script.py 
2015-06-15 20:27:54,488 [DEBUG] __main__: This is a log message from script.py
This is a print statement from module.py

我做错了什么?

注意:该示例显示了使用调试,但即使我继续为 root 记录器指定 level=DEBUG (我也尝试过 level=NOTSET)并调用my_command 中的 LOGGER.info(message) 没有任何内容记录到控制台。

最佳答案

一个潜在的问题是您在设置记录器配置之前导入模块。这样,模块会在设置日志记录之前请求记录器。

寻找fileConfig()的文档中,后续记录到预先获得的记录器失败的原因是其 disable_existing_loggers 参数的默认值:

logging.config.fileConfig(fname, defaults=None, disable_existing_loggers=True)

如果您将代码更改为

logging.config.fileConfig(
'{0}/logging.cfg'.format(os.path.dirname(os.path.realpath(__file__))),
disable_existing_loggers=False
)

问题应该消失。

请注意,现有记录器仅在配置文件中未明确命名时才会被禁用。例如:

import logging
import logging.config

lFooBefore = logging.getLogger('foo')
lScriptBefore = logging.getLogger('script')
logging.config.fileConfig('logger.ini')

lFooBefore.debug('Does not log')
lScriptBefore.debug('Does log')
logging.getLogger('foo').debug('Does also not log')
logging.getLogger('bar').debug('Does log')

不知道为什么 disable_existing_loggers 的默认值是这样的......

关于Python 根记录器消息未通过使用 fileConfig 配置的处理程序记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30854614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com