Python 如何用日志模块替换打印调试消息
到目前为止,我一直在我的代码中添加“打印调试消息”甚至“如果条件:打印调试消息”。但是很多人告诉我这不是最好的方法,我真的应该学习如何使用日志模块。在快速阅读之后,它似乎做了我可能想要的一切,然后是一些。它本身看起来像一个学习项目,我现在想做其他项目,只需使用最小的功能来帮助我。如果有什么不同的话,我现在使用的是Python2.6,由于库和遗留兼容性,我将在可预见的未来使用它 目前我想做的就是在代码中添加一些消息,在调试特定区域时,我可以一节一节地打开和关闭这些消息。作为一个“hello_log_world”,我尝试了这个,但它没有达到我的预期Python 如何用日志模块替换打印调试消息,python,logging,Python,Logging,到目前为止,我一直在我的代码中添加“打印调试消息”甚至“如果条件:打印调试消息”。但是很多人告诉我这不是最好的方法,我真的应该学习如何使用日志模块。在快速阅读之后,它似乎做了我可能想要的一切,然后是一些。它本身看起来像一个学习项目,我现在想做其他项目,只需使用最小的功能来帮助我。如果有什么不同的话,我现在使用的是Python2.6,由于库和遗留兼容性,我将在可预见的未来使用它 目前我想做的就是在代码中添加一些消息,在调试特定区域时,我可以一节一节地打开和关闭这些消息。作为一个“hello_log
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调用的注释,所有四个都会得到输出
我是否试图在一个过于简单的层次上运行它
为了获得预期的行为,我可以在那里编写的内容中添加什么最简单的内容?日志实际上遵循一个特定的层次结构(
DEBUG->INFO->WARNING->ERROR->CRITICAL
),默认级别是WARNING
。因此,您看到这两条错误消息的原因是,它位于层次结构链上的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')
getLogger()
缺少参数意味着根记录器被修改。这基本上是在@ del(好)答案之前的一步,在这里你开始进入多个记录器,每个都有自己的特定属性/输出级别等。 ,而不是修改代码中的日志记录级别来控制输出,应该考虑创建多个记录器,以及分别设置每个日志记录级别。例如:
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
错误:第一个:第一个错误
错误:第二个:第二个错误
调试:第二次:第二次调试
谢谢,我希望它能正常工作。我还没有确定对basicConfig()的调用是一次性的。然而,我认为这比这更微妙。我怀疑,在我的语句“logging.error('first error')首次使用日志模块时,该模块以默认值隐式调用basicConfig(),这意味着第一个和第二个错误之间的显式调用无效。这是一种网关代码。一旦我被设置级别、然后格式化所诱惑,我很快就会进入多个记录器。@Neil_UK我想你说得对:)网关代码是一个很好的术语,你应该为它注册商标。这无疑是一个有用的功能,可以处理多个记录器的日志记录(可以写入
stdout
、一个文件或两者兼而有之,等等)。我一直觉得有趣的一件事(当涉及到调试方面的日志记录时)是Ken Thompson主要靠print
语句:)