Python日志记录-具有root记录器的多个模块中的配置文件

时间:2018-07-24 19:28:37

标签: python python-2.7 logging multiple-files config-files

当我在配置文件中配置根记录器时。其他子记录器没有遵循相同的配置。

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>]

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

1 个答案:

答案 0 :(得分:1)

这里发生的是,在调用test.py中的logging.config.fileConfig("logger.ini")之前,已创建在main.py中提取的记录器。调用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