多个模块的Python日志记录

时间:2020-11-03 18:23:47

标签: python logging config

我正在处理具有多个模块的python项目。我试图用log.conf来实现日志记录,该日志已经按预期工作了。但是,我想知道,是否有其他方法可以将记录器添加到模块中而不向log.conf添加记录器键?因为为需要添加记录器的每个模块添加键非常麻烦。

当前,我的log.conf看起来像这样。

[loggers]
keys=root,main,xx_utils,xx_config,xx_extraction, ....

[handlers]
keys=consoleHandler,rotatingFileHandler

[formatters]
keys=defaultFormatters

[logger_root]
handlers=consoleHandler

[logger_main]
handlers=rotatingFileHandler
level=INFO
qualname=__main__
propagate=1

[xx_utils]
handlers=rotatingFileHandler
level=INFO
qualname=xx_utils
propagate=1
....

从本质上讲,我想知道是否可以创建每个模块都可以导入的loggerUtils类,这样我就不必在log.conf中添加记录器键了。

1 个答案:

答案 0 :(得分:1)

作为过去几天花了太多时间学习如何做的人,我想我终于到了,并将尝试向您指出对我有帮助的地方。

当前日志记录维护者的以下答案说明了如何很好地使用多个模块来实现:https://stackoverflow.com/a/15735146/2574074

我发现这个答案也很有帮助: https://stackoverflow.com/a/4150322/2574074

对于您的特定问题,基本上,如果所有记录器都具有相同的配置(看起来确实如此),那么我认为对您来说最简单的方法是在config中建立和配置根记录器,如下所示:

[loggers]
keys=root

[handlers]
keys=consoleHandler,rotatingFileHandler

[formatters]
keys=defaultFormatters

[logger_root]
level=DEBUG
handlers=consoleHandler,rotatingFileHandler

[handler_consoleHandler]
... your consoleHandler configuration ...

[handler_rotatingFileHandler]
... your rotatingFileHandler configuration ...

... 

但是,实际上您将不会直接登录到根记录器。

相反,在每个模块的顶部,添加以下内容:

import logging
logger = logging.getLogger(__name__)

或者您可以使用任意名称:

import logging
logger = logging.getLogger(xx_utils)

这将为每个模块建立一个新的记录器(即,无需创建单独的loggerUtils类),并且由于您未设置级别,因此默认情况下,这些记录器中的每个记录器都将具有NOTSET级别,因此记录到这些记录器的日志将为传递给父记录器,最终到达根记录器。

给我带来麻烦的重要提示是,请确保您以与其他子模块相同的方式为主模块建立记录器,但是请务必在读完配置文件并建立后再执行此操作/配置了根记录器。否则,如果将main.py作为脚本运行,则可以通过调用logger = logging.getLogger(main)logger = logging.getLogger(__name__)来自动建立root记录器,但是它将没有所需的配置。