用于多模块的Python日志记录

2024-05-23 14:22:36 发布

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

我正在从事一个包含多个模块的python项目。我尝试用log.conf实现日志记录,它已经按预期工作了。但是,我想知道,有没有其他方法可以在不向log.conf添加logger键的情况下将logger添加到模块中?因为为我需要添加logger的每个模块添加键非常麻烦

目前,我的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添加loggers键


Tags: 模块infologmainhandlersconfutilsroot
1条回答
网友
1楼 · 发布于 2024-05-23 14:22:36

作为一个在过去几天里花了太多时间学习如何做到这一点的人,我想我终于做到了,我会尝试向你指出是什么帮助了我

当前日志维护人员的回答很好地解释了如何使用多个模块实现: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__)自动建立根记录器,但它不会具有您想要的配置

相关问题 更多 >