我真的错过了关于python日志记录模块的基本知识。帮我理解python的日志记录模块及其处理程序
在下面的代码中,我创建了一个记录器对象(log
)并添加了两个处理程序。一个与 'INFO'级别和一个'警告'级别。他们都应该打印到标准输出。我希望调用log.info(msg)
将在我的标准输出中产生msg
的一个副本,并且调用log.warn(msg)
可以产生 两个副本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'
输出对我来说真的很奇怪。呼叫.info
不会导致视觉效果。 但是,调用warn
会导致将两个msg打印到stdout(这是OK),但也会将一个副本打印到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
所以我的问题是:
- 为什么,我呼吁
info
没有输出结果尽管h1
的级别设置为INFO的事实? - 为什么我打电话给
warn
会导致额外的输出到stderr?
我不能肯定,但你可能会运行到麻烦,因为Python的'logging'有警告和信息一个内置的水平。 – brc
@brc这会回答我的第一个问题,但不是第二个问题 –