【问题标题】:Python - how do I configure a child logger via a logging configuration filePython - 如何通过日志记录配置文件配置子记录器
【发布时间】:2018-10-12 16:15:35
【问题描述】:

我有一个 Python 包,其中包含一系列模块,每个模块都包含一个具有中心焦点的例程库(即一个模块可能具有与文本操作相关的例程)。我希望能够为整个包配置日志记录,但让用户能够自定义给定模块的日志记录。

我尝试使用父/子记录器来实现这一点,这样每个模块就不必拥有超过 1 个记录器。如果我在模块本身中配置子记录器,我可以成功使用父/子方法,但是我找不到通过记录器配置文件配置子记录器的正确语法。当 Python 日志记录实用程序读入配置文件时,它会阻塞任何包含点表示法的记录器“键”(即,如果我尝试定义记录器“root、parent、parent.child”,则配置文件的摄取将阻塞“ parent.child”键)。

所以,我正在寻找一种解决方案,即给定模块只需有一个记录器,但用户可以以一种方式为整个包配置日志记录,但为特定模块配置不同的方式。父/子方法似乎最有前途。

如果模块有办法确定日志管理器定义的记录器,我也可以使用它。例如,假设我可以在名为 allUtil 和 textUtil 的日志记录配置文件中定义两个记录器。如果文本实用程序模块可以确定日志管理器是否定义了 textUtil 记录器,则它可以使用该记录器,否则它将使用 allUtil 记录器。不幸的是,我也无法找出正确的 Python 代码来执行此操作。

我愿意接受建议。

【问题讨论】:

  • 我明白了,您基本上想在配置文件中定义一堆记录器,然后让您的每个模块在该配置中发现自己的自定义记录器(如果有的话),或者使用通用的万能的,如果没有自定义的?
  • 库代码获取一个记录器(带有logging.getLogger(name))并使用它。应用程序代码配置记录器(dictConfig 通常是最有用的方法)。库代码绝不能尝试配置日志记录,也不必关心配置了哪些记录器以及如何配置。
  • 请发布 MCVE。配置子记录器 JustWorks(tm),我在 django 项目中经常这样做。

标签: python logging parent-child


【解决方案1】:

这是我想出的似乎可行的方法。

设置:

  • 我有一个名为“myapp”的应用程序
  • 我有一个名为“utils”的包
  • 我在包“utils”中有一个名为“miscUtils”的模块

在日志配置文件中我有以下内容(仅显示相关内容)

[loggers]
keys=root,myapp,utils,miscUtils
.
.
.
[logger_root]
level=DEBUG
handlers=consoleHandler

[logger_myapp]
level=CRITICAL
handlers=consoleHandler
qualname=myapplogger
propagate=0

[logger_utils]
level=WARNING
handlers=consoleHandler
qualname=myapplogger.utils
propagate=1

[logger_miscUtils]
level=DEBUG
handlers=consoleHandler
qualname=myapplogger.utils
propagate=1
.
.
.
  • 在模块 utils.miscUtils.py 中,我使用记录器“myapplogger.utils.misc”。
  • 在“utils”包中的所有其他模块中,它们都使用记录器 'myapplogger.utils.xxx',其中 xxx 代表特定模块。
  • 在主程序模块 myapp.py 中,我使用记录器“myapplogger”, 但我明确将其级别设置为 INFO。

当我运行程序时,来自主模块问题的日志消息会记录来自 INFO 的消息。除 miscUtils.py 之外的所有 'utils' 模块都将记录从 WARNING 开始的消息。但是,从使用记录器“myapplogger.utils.miscUtils”的模块 miscUtils.py 生成的所有日志消息都会从 DEBUG 发出日志消息。

通过配置文件,我现在可以根据需要定义整体程序日志级别、包日志级别和模块日志级别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多