[英]Python logging for multiple modules
我正在开发一个包含多个模块的 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 类,这样我就不需要将 loggers 键添加到 log.conf。
作为过去几天花了太多时间学习如何做到这一点的人,我想我终于到了,并会尝试向您指出对我有帮助的地方。
当前日志维护者的这个答案解释了如何很好地实现多个模块: https : //stackoverflow.com/a/15735146/2574074
我发现这个答案也非常有帮助: https : //stackoverflow.com/a/4150322/2574074
对于您的具体问题,本质上,如果您的所有记录器都具有相同的配置(正如它们所显示的那样),那么我认为对您来说最简单的方法是在您的配置中建立和配置您的根记录器,如下所示:
[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__)
自动建立根记录logger = logging.getLogger(main)
,但它不会具有您想要的配置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.