首页 > 解决方案 > Python日志记录-具有根记录器的多个模块中的配置文件

问题描述

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

主文件

import logging
import logging.config
import test


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

测试.py

import logging

logger = logging.getLogger(__name__)

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

记录器.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>]

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

标签: pythonpython-2.7loggingconfiguration-files

解决方案


这里发生的情况是,获取的记录器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


推荐阅读