到目前为止,我一直在使用'打印调试消息'来处理我的代码,甚至'如果条件:打印调试消息'。但是很多人告诉我这不是最好的方法,我真的应该学习如何使用日志记录模块。快速阅读之后,看起来好像它可以做我想做的一切,然后是一些。它本身看起来像一个学习项目,我现在想在其他项目上工作,只需使用最少的功能来帮助我。如果它有任何区别,我将使用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调用,那么所有四个都会输出。
我是否试图以过于简单的程度运行它?
为了达到预期的行为,我可以添加到我最简单的内容是什么?
答案 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