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

时间:2018-06-19 07:41:20

标签: python logging config

我找到了很多文档和教程,例如official logging config docsofficial logging cookbooknice 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名称相关联,其余属性也似乎都没有设置。具体来说,我明白了:

>>> my_logger
<Logger dev_model (WARNING)>

我不太了解logging模块,无法理解问题所在。我想要的是:

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

如何做到这一点?

2 个答案:

答案 0 :(得分:2)

如果我正确理解了该问题,则问题是由于记录器本身具有日志级别,而不仅仅是处理程序。记录器的日志级别默认为{ "userId":1234, "role":"hello", "sessionToken":"91da56ba-ac18-409d-8de0-9ec944781b49", "showWelcomePage":gh, "accountType":0, "businessType":"Enterprise-Location", "accountCount":3, "accountId":null, "userOutputMessage":null, "businessOutputMessage":null, "businessId":2345678ggt4, "business":null } ,这似乎是在记录器上设置的。如果生成的消息的优先级低于记录器的级别,则它甚至不会处理处理程序。

因此,请尝试将记录器的WARNING设置为levelDEBUG应该忽略比其自身级别更详细的任何消息。

至于这部分:

  

其余属性似乎都没有设置。

调用记录器的info_file_handler方法会发生什么,以将Logger转换为某种字符串表示形式以进行呈现。不能保证显示对象的所有属性。

答案 1 :(得分:0)

这么长的问题......我太久不能理解了。

但我认为你误解了处理程序的工作原理。实际上,记录器本身并不输出除处理程序之外的任何东西。

因此,如果您在DEBUG记录器上设置dev,它会将日志&gt; = DEBUG传递给所有处理程序。然后debug_console处理程序将处理日志&gt; = DEBUG,但info_file_handler将仅处理日志&gt; = INFO。在DEBUG记录器上设置dev不会让info_file_handler输出日志&lt; INFO。所以你可以有两个单独的级别,一个是&gt; = DEBUG并进入控制台而另一个是&gt; = INFO并转到文件。

我假设我理解你......