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