我来自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>
答案 0 :(得分:3)
您有一个相当简单的错误:请注意,根据the docs, 一个dict,其中每个键都是一个记录器名称,每个值都是一个dict
描述如何配置相应的Logger实例 添加此键并缩进相应的行,以提供: 按预期工作:root
以外的记录器的配置应位于loggers
键下:< / p>
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