2

到目前为止,我一直在我的代码中添加“打印调试消息”甚至“如果条件:打印调试消息”。但是很多人告诉我这不是最好的方法,我真的应该学习如何使用日志记录模块。快速阅读后,它看起来好像做了我可能想要的一切,然后是一些。它本身看起来像是一个学习项目,我现在想从事其他项目,只需使用最少的功能来帮助我。如果它有什么不同,我在 python 2.6 上,并且由于库和遗留兼容性,将在可预见的未来。

我现在想做的就是在我的代码中添加一些可以逐段打开和关闭的消息,因为我设法调试特定区域。作为“hello_log_world”,我尝试了这个,但它没有达到我的预期

import logging

# logging.basicConfig(level=logging.DEBUG)

logging.error('first error')
logging.debug('first debug')

logging.basicConfig(level=logging.DEBUG)

logging.error('second error')
logging.debug('second debug')

你会注意到我使用了非常基本的配置,使用尽可能多的默认值,以保持简单。但似乎它太简单了,或者我不了解日志记录背后的编程模型。

我曾预计 sys.stderr 会以

ERROR:root:first error
ERROR:root:second error
DEBUG:root:second debug

...但只出现两条错误消息。设置 level=DEBUG 不会使第二个出现。如果我在程序开始时取消注释 basicConfig 调用,所有四个都会得到输出。

我是否试图以过于简单的级别运行它?

我可以添加到我在那里写的内容中以获得预期行为的最简单的东西是什么?

4

2 回答 2

2

日志记录实际上遵循特定的层次结构 ( DEBUG -> INFO -> WARNING -> ERROR -> CRITICAL),默认级别是WARNING. 因此,您看到两条 ERROR 消息的原因是因为它位于WARNING层次结构链的前面。

至于奇怪的评论行为,可以在日志记录文档中找到解释(正如你所说的,这对他们自己来说是一项任务:)):

对 basicConfig() 的调用应在对 debug()、info() 等的任何调用之前进行。由于它旨在作为一次性的简单配置工具,因此只有第一个调用实际上会做任何事情:后续调用实际上是无操作的。

但是,您可以使用该setLevel参数来获得您想要的:

import logging

logging.getLogger().setLevel(logging.ERROR)

logging.error('first error')
logging.debug('first debug')

logging.getLogger().setLevel(logging.DEBUG)

logging.error('second error')
logging.debug('second debug')

缺少参数 togetLogger()意味着根记录器已被修改。这基本上是@del(好)答案之前的一步,您开始进入多个记录器,每个记录器都有自己的特定属性/输出级别/等。

于 2012-10-29T06:10:27.923 回答
1

与其修改代码中的日志记录级别来控制输出,不如考虑创建多个记录器,并分别为每个记录器设置日志记录级别。例如:

import logging

first_logger = logging.getLogger('first')
second_logger = logging.getLogger('second')

logging.basicConfig()
first_logger.setLevel(logging.ERROR)
second_logger.setLevel(logging.DEBUG)

first_logger.error('first error')
first_logger.debug('first debug')

second_logger.error('second error')
second_logger.debug('second debug')

这输出:

错误:第一个:第一个错误
错误:第二:第二个错误
调试:第二:第二次调试
于 2012-10-29T06:19:26.720 回答