3

我正在使用 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

基本上所有内容都会打印两次,而不仅仅是错误和关键消息。我在这里做错了什么?谢谢!

4

2 回答 2

2

经过一些快速研究,似乎 Handler 对象不会自动使用其父 Logger 的日志级别。您必须自己设置级别

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)

...
于 2012-09-26T19:21:53.490 回答
0

您的问题是您在子日志上将级别设置为 DEBUG。因此,您将收到所有消息(只需更改为 ERROR)。此外,logger.propagate 为 True 存在问题。

这应该解决它:

sublog.propagate = False

这将停止重复的消息。

在此处查看有关日志记录的文档。

于 2012-09-26T19:11:54.803 回答