2012-09-26 91 views
3

我正在使用python的标准日志记录系统来记录我的应用程序。我想打印所有类型的消息(通过关键调试)到控制台,但如果消息级别错误或更高,我也想发送电子邮件。我一直在阅读有关日志记录的文档,但它有点令人困惑。我设置了下面的测试,但它似乎没有正常工作:设置python logging的麻烦

import logging 

log = logging.getLogger('my_test_log') 
sublog = logging.getLogger('my_test_log.sublog') 

log.setLevel(logging.ERROR) 
log.addHandler(logging.StreamHandler()) 

sublog.addHandler(logging.StreamHandler()) 
sublog.setLevel(logging.DEBUG)  

sublog.debug('This is a debug message') 
sublog.info('This is an info message') 
sublog.warn('This is a warn message') 
sublog.error('This is an error message') 
sublog.critical('This is a critical message') 

注:我成立了两个日志StreamHandler中的,因为现在我不想垃圾邮件还没有,但应该在技术上只需打印错误和重要消息两次,而不是在这种情况下发送给电子邮件。

This is a debug message 
This is a debug message 
This is an info message 
This is an info message 
This is a warn message 
This is a warn message 
This is an error message 
This is an error message 
This is a critical message 
This is a critical message 

基本上一切都被印刷两次,而不仅仅是错误和关键消息:在此之后的作品通过电子邮件发送它关闭

这是我的输出,当我运行这段代码,我将其更改为SMTP。我在这里做错了什么?谢谢!

回答

2

经过一番快速研究,似乎Handler对象不会自动使用其父记录器的日志级别。你必须set the level yourself

import logging 

log = logging.getLogger('my_test_log') 
sublog = logging.getLogger('my_test_log.sublog') 

log.setLevel(logging.ERROR) 
handler = logging.StreamHandler() 
handler.setLevel(logging.ERROR) 
log.addHandler(handler) 

... 
+0

好吧,这将有道理为什么它不会工作。我只是试过这个,它的工作原理!谢谢! –

0

你的问题是你的子级上的级别设置为DEBUG。所以,你会得到所有的消息(只是改变为错误)。此外,logger.propagate为True也有问题。

这应该修复它:

sublog.propagate = False 

这将停止重复的消息。

查看有关logging here的文档。