登录Python时重复消息

时间:2014-02-04 14:59:30

标签: python logging

我想我已经尝试了任何组合,我一直在关注伐木问题。我一直试图让我的头围绕着Logging食谱和各种帖子提到同样的问题,但我只是不知道。我的代码很简单:

主要模块(main.py):

#my modules
import manager
import metadata

import logging
import logging.config

if config_file:
    logging.config.fileConfig(config_file)
else:
    logging.basicConfig(level=logging.INFO)

然后在manager.py模块中导入的两个模块(metadata.pymain.py)中:

import logging
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

最后,记录器配置文件:

[loggers]
keys=root, manager, metadata

[logger_root]
level=NOTSET
handlers=console
qualname=root

[logger_manager]
level=DEBUG
handlers=console
qualname=manager

[logger_metadata]
level=DEBUG
handlers=console
qualname=metadata

如果我现在运行main.py,我最终只会记录root

另一方面,如果我按如下方式更改我的代码:

manager.py:

import logging
logger = logging.getLogger('manager')
logger.addHandler(logging.NullHandler())

metadata.py:

import logging
logger = logging.getLogger('metadata')
logger.addHandler(logging.NullHandler())

我将managermetadata重复记录。

任何提示都将不胜感激。

2 个答案:

答案 0 :(得分:0)

对于问题的第一部分,请检查 _ 名称 _ 变量的实际值。因为它取决于文件位置和导入方法,它可能不是您所期望的:

import logging
print __name__
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())

第二部分:

来自Logging HOWTO

子记录器将消息传播到与其祖先记录器关联的处理程序。因此,不必为应用程序使用的所有记录器定义和配置处理程序。为顶级记录器配置处理程序并根据需要创建子记录器就足够了。 (但是,您可以通过将记录器的传播属性设置为False来关闭传播。)

所以你的配置应该是这样的:

[loggers]
keys=root, manager, metadata

[logger_root]
level=NOTSET
handlers=console
qualname=root

[logger_manager]
level=DEBUG
handlers=console
qualname=manager
propagate=0

[logger_metadata]
level=DEBUG
handlers=console
qualname=metadata
propagate=0

或者喜欢:

[loggers]
keys=root, manager, metadata

[logger_root]
level=NOTSET
handlers=console
qualname=root

[logger_manager]
level=DEBUG
qualname=manager

[logger_metadata]
level=DEBUG
qualname=metadata

答案 1 :(得分:0)

在这里找到答案:Python日志记录:different behavior between using fileconfig and programmatic config

基本上,我必须在disable_existing_loggers=False电话中添加logging.config.fileConfig。因此,对我有用的代码是:

if config_file:
    logging.config.fileConfig(config_file, disable_existing_loggers=False)
else:
    logging.basicConfig(level=logging.INFO)

这也使我能够将日志记录配置简化为根记录器:

[loggers]
keys=root

[logger_root]
level=DEBUG
handlers=console
qualname=root