Python `logging` 模块 + YAML 配置文件

Python `logging` module + YAML config file

我找到了很多文档和教程,例如 official logging config docs, the official logging cookbook, and this nice tutorial by Fang

他们每个人都让我接近答案,但不完全是。我的问题是:

使用配置文件时,如何在 2 个不同级别使用具有 2 个独立处理程序的记录器?


澄清一下,这是我的 YAML 文件的示例:

---
version: 1
handlers:
  debug_console:
    class: logging.StreamHandler
    level: DEBUG
.
.
.

  info_file_handler:
    class: logging.handlers.RotatingFileHandler
    level: INFO
.
.
.

loggers:
  dev:
    handlers: [debug_console, info_file_handler]
  test:
    handlers: [info_file_handler]
root:
  handlers: [info_file_handler]

我想要 两种方式 到 运行 记录器,其中一种方式 (dev) 比另一种方式更冗长。 此外,当 运行 连接 dev 记录器时,我希望它为两个不同的处理程序设置两个不同的级别。

这是尝试启动记录器的代码片段:

with open('logging.yaml', 'r') as f:
  log_cfg = yaml.safe_load(f.read())
  logging.config.dictConfig(log_cfg)
  my_logger = logging.getLogger('dev')

上面的 dictConfig 行工作正常。我这样说是因为当我得到要求登录到控制台的代码时,我会在日志打印出来时看到 dev 作为名称。 (我已经编辑了 yaml,但它包含格式 %(name)s。)

但是my_logger有点问题。 尽管它与dev名称相关联,但其余属性的none似乎已被删除放。具体我看:

>>> my_logger
<Logger dev_model (WARNING)>

我对 logging 模块的了解还不够,无法理解问题出在哪里。我想要的是:

当我激活 'dev' 记录器时,我想启动 2 个处理程序,一个在 DEBUG 级别并写入控制台,另一个在 INFO级别并写入文件。

如何做到这一点?

好长的问题……太长了我没看懂。

但我认为您误解了处理程序的工作方式。实际上记录器本身不输出任何东西,但处理程序输出。

假设您在 dev 记录器上设置 DEBUG,它会将日志 >= DEBUG 传递给所有处理程序。然后 debug_console 处理程序将处理日志 >= DEBUGinfo_file_handler 将只处理日志 >= INFO。在 dev 记录器上设置 DEBUG 不会让 info_file_handler 输出日志 < INFO。所以你可以有两个单独的级别,一个是 >= DEBUG 并转到控制台,而另一个是 >= INFO 并转到文件。

我假设我理解正确...

如果我没看错的话,问题是记录器本身有日志级别,而不仅仅是处理程序。 Logger 的日志级别默认为 WARNING,这似乎是在您的 logger 上设置的。如果生成的消息的优先级低于记录器的级别,那么它甚至不会发送给处理程序。

因此请尝试将记录器的 level 设置为 DEBUGinfo_file_handler 应忽略任何比其自身级别更冗长的消息。

关于这部分:

none of the rest of the attributes seem to have been set.

调用 logger 的 repr() 方法将 Logger 转换为某种字符串表示形式以便呈现它。不保证显示对象的所有属性。