我想我已经尝试了任何组合,我一直在关注伐木问题。我一直试图让我的头围绕着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.py
和main.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())
我将manager
和metadata
重复记录。
任何提示都将不胜感激。
答案 0 :(得分:0)
对于问题的第一部分,请检查 _ 名称 _ 变量的实际值。因为它取决于文件位置和导入方法,它可能不是您所期望的:
import logging
print __name__
logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())
第二部分:
子记录器将消息传播到与其祖先记录器关联的处理程序。因此,不必为应用程序使用的所有记录器定义和配置处理程序。为顶级记录器配置处理程序并根据需要创建子记录器就足够了。 (但是,您可以通过将记录器的传播属性设置为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