Python记录多个模块记录器不在主程序外工作
我的目标是从多个模块进行日志记录,而只在一个地方配置记录器 – 在主程序中.如
this answer所示,应该包括
logging.config.fileConfig('/path/to/logging.conf') 在主程序中,然后在所有其他模块中包括 logger = logging.getLogger(__name__) 我相信这就是我在下面所做的,但我得到了意想不到的行为. c.py # c.py import logging import logging.config import d logging.config.fileConfig("logging.conf") logger = logging.getLogger(__name__) logger.warning('logging from c') d.foo() d.py # d.py import logging logger = logging.getLogger(__name__) # this will print when d is imported logger.warning('logging from d on import') def foo(): # this does not print logger.warning("logging from d on call foo()") 产量 $python c.py logging from d on import logging from c 我除了之外,是当d.foo()在c.py中执行时,将从d记录消息,但事实并非如此.这很令人困惑,因为当从d中的模块级别调用记录器时,它会将一条消息记录到控制台,但是当从foo()内部调用时它不会. 配置文件 [loggers] keys=root [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [formatter_simpleFormatter] format=%(message)s datefmt= 更深入的分析 所以我注意到,如果我删除该行 logging.config.fileConfig("logging.conf") 从c.py开始,然后从d.foo()进行日志记录按预期工作.所以在配置文件中有一些错误,或者由于我提供的配置文件导致d.py中的记录器搞砸了. 题 >为什么从模块级别调用时会从d记录消息,而不是从d.foo()内部调用? 解决方法
问题在于这样一个事实
import d 来之前 logging.config.fileConfig("logging.conf") 正如@davidejones所指出的那样.原因如下: 如docs中所述,当调用logging.config.fileConfig()时,其默认行为是禁用任何现有记录器.因此,当导入d发生时,logger在d中初始化,然后当调用logging.config.fileConfig()时,d中的记录器被禁用,这就是为什么我们在调用d.foo()时没有看到任何记录. 解 logging.config.fileConfig()接受一个参数disable_existing_loggers,默认为True.使用 logging.config.fileConfig("logging.conf",disable_existing_loggers=False) 输出变成了 >>> python c.py logging from d on import logging from c logging from d on call foo() 正如所料. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |