Python中记录器和记录器配置的继承



我来自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' )

----主.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定义的处理程序?

您有一个相当简单的错误:请注意,根据文档,除了root之外的记录器的配置应该在loggers键下,如下所示:

一种dict,其中每个键都是记录器名称,每个值都是dict描述如何配置相应的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

最新更新