我真的很想念python的日志记录模块.
在下面的代码中,我创建了一个logger对象(log)并向其添加了两个处理程序.一个具有'INFO'级别,一个具有'WARNING'级别.它们都应该打印到stdout.我希望调用log.info(msg)
将导致msg我的标准输出中的一个副本并且调用log.warn(msg)sould导致两个副本msg打印到我的标准输出.这是代码:
import logging
import sys
logging.basicConfig()
log = logging.getLogger('myLogger')
log.handlers = []
h1 = logging.StreamHandler(sys.stdout)
h1.level = logging.INFO
h1.formatter = logging.Formatter('H1 H1 %(message)s ')
h2 = logging.StreamHandler(sys.stdout)
h2.level = logging.WARNING
h2.formatter = logging.Formatter('H2 H2 %(message)s')
log.addHandler(h1)
log.addHandler(h2)
print 'log.level == %s'%logging.getLevelName(log.level)
print 'log.info'
log.info('this is some info')
print 'done'
print 'log.warn'
log.warn('this is a warning')
print 'done'
Run Code Online (Sandbox Code Playgroud)
输出对我来说真的很奇怪.该.info呼叫导致没有视觉效果.但是,调用warn结果将两个msg的副本打印到stdout(可以),还有一个副本打印到stderr(为什么?).这是上面代码的输出.请注意此输出中最后一行的格式.这行打印到stderr.
log.level == NOTSET
log.info
done
log.warn
H1 H1 this is a warning
H2 H2 this is a warning
done
WARNING:myLogger:this is a warning
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
info导致没有输出,尽管事实上它h1的级别被设置为INFO?warn导致stderr的额外输出?您需要知道两件事:
根记录器初始化为一个级别WARNING.
如果记录器的级别低于记录器的级别,则会丢弃到达记录器的任何日志消息.如果未设置记录器的级别,则将从其父记录器获取其"有效级别".因此,如果根记录器的级别为WARNING,则所有记录器的默认有效级别为WARNING.如果不进行其他配置,则将丢弃级别低于该级别的所有日志消息.
当您调用时basicConfig(),系统会自动StreamHandler在根记录器上设置一个打印到标准错误流的根记录器.
当你的程序打印出它的日志消息时,实际上有三个处理程序:你添加的两个处理程序,它们有自己的级别,还有一个来自系统,它将打印出任何未被其记录器拒绝的消息.这就是你获得这条线的原因
WARNING:myLogger:this is a warning
Run Code Online (Sandbox Code Playgroud)
它来自系统记录器.它不会对INFO级别消息执行此操作,因为如前所述,根记录器配置为默认拒绝这些消息.
如果您不想要此输出,请不要致电basicConfig().
进一步阅读:http://docs.python.org/howto/logging.html
| 归档时间: |
|
| 查看次数: |
960 次 |
| 最近记录: |