Python - 如何通过日志记录配置文件

时间:2018-05-02 14:03:35

标签: python logging parent-child

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

我尝试使用父/子记录器完成此操作,以便每个模块不必具有多于1个记录器。如果我在模块本身配置子记录器,我可以成功使用父/子方法,但是我找不到通过记录器配置文件配置子记录器的正确语法。当Python日志记录实用程序读入配置文件时,它会在包含点表示法的任何记录器“键”上窒息(即,如果我尝试定义记录器" root,parent,parent.child"配置文件的摄取将扼杀" parent.child" key)。

因此,我正在寻找一种解决方案,即给定模块只需要一个记录器,但用户可以单向配置整个包的记录,但对于特定模块则采用不同的方式。父母/子女方法似乎最有希望。

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

我愿意接受建议。

UND

1 个答案:

答案 0 :(得分:0)

以下是我想出来的效果。

设置:

  • 我有一个名为' 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
.
.
.

[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模块中,我使用了logger' myapplogger.utils.misc'。
  • 在' utils'中的所有其他模块中包他们使用记录器 ' myapplogger.utils.xxx' xxx表示特定模块。
  • 在主程序模块myapp.py中,我使用记录器' myapplogger', 但我明确地将其级别设置为INFO。

当我运行程序时,来自主模块的日志消息会发出来自INFO的日志消息。所有' utils'模块,但miscUtils.py,将从警告开始记录消息。但是,从模块miscUtils.py生成的所有日志消息都使用了logger' myapplogger.utils.miscUtils'从DEBUG发出日志消息。

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