Python logging - 在多个模块中使用 root logger 配置文件

Python logging - config file in multiple modules with root logger

当我在配置文件中配置根记录器时。其他 children 个记录器不遵循相同的配置。

main.py

import logging
import logging.config
import test


logging.config.fileConfig("logger.ini")
logger = logging.root
logger.critical("main")
test.f()

test.py

import logging

logger = logging.getLogger(__name__)

def f():
    print "inside f"
    logger.critical("Test")
    print logger.parent.name
    print logger.parent.handlers

logger.ini

[loggers]
keys=root

[handlers]
keys=console
[formatters]
keys=form
[logger_root]
level=DEBUG
handlers=console

[handler_console]
class=StreamHandler
formatter=form
args=()

[formatter_form]
format=%(levelname)s:%(name)s:%(message)s

当我 运行 我没有的程序我得到了

CRITICAL:root:main
inside f
root
[<logging.StreamHandler object at 0x00000000021C4908>]

但是我没有其他文件的日志。 我认为如果 children 没有任何处理程序,他会将日志发送到他的 parent。知道为什么我看不到日志吗?或者如何解决?

这里发生的是在 test.py 中获取的记录器是在您在 main.py 中调用 logging.config.fileConfig("logger.ini") 之前创建的。一旦 fileConfig 被调用,所有未在配置文件中指定的预先存在的记录器将被删除。

我可以建议两种方法来解决这个问题:

  1. 不要在模块的全局范围内调用logging.getLogger,只有在函数/方法中需要记录器时才会调用

  2. 更改您的代码,以便在调用 fileConfig() 时指定:logging.config.fileConfig("logger.ini", disable_existing_loggers=False)。这会导致在应用配置之前创建的任何记录器得到维护而不是被禁用。

有关选项 #2 的详细信息,请参阅 https://docs.python.org/2/library/logging.config.html#logging.config.fileConfig