登录Python时出现重复消息

2024-05-01 21:46:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我想我已经尝试过任何一种组合,我在伐木方面一直在碰壁。我一直在试着去了解一下伐木食谱和各种提到同一问题的帖子,但我还是不明白。我的代码相当简单:

主模块(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)

然后在导入到main.py模块中的两个模块(manager.pymetadata.py)中:

^{pr2}$

最后,logger配置文件:

[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

如果我现在运行主.py,我将只记录root。在

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

在经理.py公司名称:

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

在元数据.py公司名称:

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

我将获得managermetadata的重复日志记录。在

如有任何提示,将不胜感激。在


Tags: 模块代码pyimportconfiglogginghandlersmanager
2条回答

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

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

第二部分:

来自Logging HOWTO

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

所以你的配置应该是:

^{pr2}$

或类似的:

[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

在这里找到了答案: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)

这还允许我将日志记录配置简化为仅根日志记录器:

^{pr2}$

相关问题 更多 >