我正在使用python的标准日志记录系统来记录我的应用程序。我想打印所有类型的消息(通过关键调试)到控制台,但如果消息级别错误或更高,我也想发送电子邮件。我一直在阅读有关日志记录的文档,但它有点令人困惑。我设置了以下测试,但它似乎无法正常工作:
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,因为我还不想发送垃圾邮件,但从技术上讲,它应该只打印错误和关键邮件两次,而不是在这种情况下将其发送到电子邮件。我会将此更改为SMTP,以便通过电子邮件将其发送出去
这是我运行此代码时的输出:
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
基本上所有内容都会打印两次,而不仅仅是错误和关键消息。我在这做错了什么?谢谢!
答案 0 :(得分:2)
经过一些快速研究后,似乎Handler对象不会自动使用其父Logger的日志级别。你必须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)
...
答案 1 :(得分:0)
您的问题是您在子日志上将级别设置为DEBUG。因此,您将获得所有消息(只需更改为ERROR)。此外,logger.propagate为True也存在问题。
这应该解决它:
sublog.propagate = False
这将停止重复的消息。
查看有关logging here的文档。