Help me understanding python's logging module and its handlers
我真的很怀念关于Python日志模块的一些基本知识。
在下面的代码中,我创建了一个logger对象(
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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' |
输出对我来说真的很奇怪。
1 2 3 4 5 6 7 8 | 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 |
号
所以我的问题是:
你需要知道两件事:
根记录器初始化为
如果到达记录器的任何日志消息的级别低于记录器的级别,则将丢弃该消息。如果未设置记录器的级别,它将从其父记录器获取其"有效级别"。因此,如果根记录器的级别为
当您调用
当您的程序打印出它的日志消息时,实际上有三个处理程序:您添加的两个处理程序有自己的级别,系统中的一个处理程序将打印出任何没有被它的记录器拒绝的消息。这就是为什么你要排队的原因
1 | WARNING:myLogger:this is a warning |
号
它来自系统记录器。对于
如果您不想要这个输出,不要调用
进一步阅读:http://docs.python.org/howto/logging.html
日志记录实际上有五个级别:调试、信息、警告、错误和关键。我看到,当您设置日志程序时,您没有显式地设置级别——我相信如果没有设置级别,日志程序可能默认为警告。
至于为什么它会多次打印以发出警告,我认为这是因为您创建了两个信息和警告处理程序。发生的情况是记录器从warning->info->debug以严重性级联,为每个事件调用处理程序。由于级别设置为"警告",因此将忽略信息处理程序。此外,我相信警告消息通常会写入sys.stderr。
请尝试以下操作:
1 | logging.basicConfig(level=logging.INFO) |
另请参见:
- 日志模块文档
- 日志记录基本示例