【发布时间】:2017-07-14 20:37:20
【问题描述】:
我的目标是从多个模块进行记录,同时只在一个地方配置记录器 - 在主程序中。如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()内部记录? - 而我怎样才能实现从多个模块进行日志记录的目标,而只在主程序中配置日志记录呢?
【问题讨论】: