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
处理程序将处理日志 >= DEBUG
但 info_file_handler
将只处理日志 >= INFO
。在 dev
记录器上设置 DEBUG
不会让 info_file_handler
输出日志 < INFO
。所以你可以有两个单独的级别,一个是 >= DEBUG
并转到控制台,而另一个是 >= INFO
并转到文件。
我假设我理解正确...
如果我没看错的话,问题是记录器本身有日志级别,而不仅仅是处理程序。 Logger 的日志级别默认为 WARNING
,这似乎是在您的 logger 上设置的。如果生成的消息的优先级低于记录器的级别,那么它甚至不会发送给处理程序。
因此请尝试将记录器的 level
设置为 DEBUG
。 info_file_handler
应忽略任何比其自身级别更冗长的消息。
关于这部分:
none of the rest of the attributes seem to have been set.
调用 logger 的 repr()
方法将 Logger 转换为某种字符串表示形式以便呈现它。不保证显示对象的所有属性。
我找到了很多文档和教程,例如 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
处理程序将处理日志 >= DEBUG
但 info_file_handler
将只处理日志 >= INFO
。在 dev
记录器上设置 DEBUG
不会让 info_file_handler
输出日志 < INFO
。所以你可以有两个单独的级别,一个是 >= DEBUG
并转到控制台,而另一个是 >= INFO
并转到文件。
我假设我理解正确...
如果我没看错的话,问题是记录器本身有日志级别,而不仅仅是处理程序。 Logger 的日志级别默认为 WARNING
,这似乎是在您的 logger 上设置的。如果生成的消息的优先级低于记录器的级别,那么它甚至不会发送给处理程序。
因此请尝试将记录器的 level
设置为 DEBUG
。 info_file_handler
应忽略任何比其自身级别更冗长的消息。
关于这部分:
none of the rest of the attributes seem to have been set.
调用 logger 的 repr()
方法将 Logger 转换为某种字符串表示形式以便呈现它。不保证显示对象的所有属性。