【问题标题】:Logging and inheritance of loggers' configurations in Python在 Python 中记录和继承记录器的配置
【发布时间】:2016-07-20 11:57:50
【问题描述】:

我来自 SLF4J 和 Log4J,所以这可能是我不明白 Python 中日志记录如何工作的原因。

我有以下

---- logging.yaml

version: 1

handlers:

  console:
    class: logging.StreamHandler
    level: DEBUG
    stream: ext://sys.stderr
    formatter: simpleFormatter

  file:
    class: logging.FileHandler
    filename: app.log
    mode: w
    level: DEBUG
    formatter: simpleFormatter

formatters:
  simpleFormatter:
    #class: !!python/name:logging.Formatter
    #class: logging.Formatter
    format: '%(name)s %(asctime)s %(levelname)s %(message)s'
    datefmt: '%d/%m/%Y %H:%M:%S'


root:
  level: INFO
  handlers: [console, file]

mod:
  level: DEBUG

--mod.py

import logging

def foo ():
    log = logging.getLogger ( __name__ )
    log.debug ( 'Hello from the module' )

---- main.py

from logging.config import dictConfig
import yaml
with open ( 'logging.yaml' ) as flog:
    dictConfig ( yaml.load ( flog ) )

import logging

from mod import foo

if __name__ == '__main__':

    log = logging.getLogger ( __name__ )
    log.debug ( 'Hello from main' )

    foo ()

使用上面的配置,我希望只看到消息'Hello from the module'。相反,没有打印任何内容。当我为根记录器设置DEBUG 时,会打印两条消息。

那么,消息不是转发给上层记录器的吗? mod 记录器不是root 的孩子吗? mod 记录器不是继承了handlers 配置吗? (我尝试在mod 中重复handlers,但没有任何变化)。

我怎样才能实现这样的配置:默认级别是INFO,这个模块和子模块的级别是DEBUG,一切都转到为root定义的处理程序?

【问题讨论】:

标签: python logging


【解决方案1】:

您有一个相当简单的错误:请注意,根据the docs,记录器的配置root 应该在loggers 键下为:

一个字典,其中每个键是一个记录器名称,每个值是一个字典 描述如何配置对应的Logger实例

添加这个键并缩进适当的行,给出:

loggers:
  mod:
    level: DEBUG

按预期工作:

$ python main.py
mod 20/07/2016 14:35:32 DEBUG Hello from the module

$ cat app.log
mod 20/07/2016 14:35:32 DEBUG Hello from the module

【讨论】:

  • 我知道这很愚蠢!谢谢 Jon,要补充的一件事是 root 不能进入记录器。
  • @zakmck 是的:再次,“除了 root”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2014-01-28
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
相关资源
最近更新 更多