如何使用日志记录模块替换打印调试消息

时间:2012-10-29 05:54:21

标签: python logging

到目前为止,我一直在使用'打印调试消息'来处理我的代码,甚至'如果条件:打印调试消息'。但是很多人告诉我这不是最好的方法,我真的应该学习如何使用日志记录模块。快速阅读之后,看起来好像它可以做我想做的一切,然后是一些。它本身看起来像一个学习项目,我现在想在其他项目上工作,只需使用最少的功能来帮助我。如果它有任何区别,我将使用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

...但只显示两条错误消息。设置级别= DEBUG不会显示第二个。如果我在程序开始时取消注释basicConfig调用,那么所有四个都会输出。

我是否试图以过于简单的程度运行它?

为了达到预期的行为,我可以添加到我最简单的内容是什么?

2 个答案:

答案 0 :(得分:2)

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

至于奇怪的评论行为,可以在logging docs中找到解释(正如你所说的那样是自己的任务:) :):

  

对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')

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

答案 1 :(得分: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')

输出:

ERROR:first:first error
ERROR:second:second error
DEBUG:second:second debug
相关问题