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

时间:2016-07-20 11:57:50

标签: python logging

我来自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配置? (我试图在handlers中重复mod,但没有任何变化)。

如何实现配置说:默认级别为INFO,此模块和子模块的级别为DEBUG,所有内容都转到为root定义的处理程序?< / p>

1 个答案:

答案 0 :(得分:3)

您有一个相当简单的错误:请注意,根据the docsroot 以外的记录器的配置应位于loggers键下:< / p>

  

一个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