Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用日志模块替换打印调试消息_Python_Logging - Fatal编程技术网

Python 如何用日志模块替换打印调试消息

Python 如何用日志模块替换打印调试消息,python,logging,Python,Logging,到目前为止,我一直在我的代码中添加“打印调试消息”甚至“如果条件:打印调试消息”。但是很多人告诉我这不是最好的方法,我真的应该学习如何使用日志模块。在快速阅读之后,它似乎做了我可能想要的一切,然后是一些。它本身看起来像一个学习项目,我现在想做其他项目,只需使用最小的功能来帮助我。如果有什么不同的话,我现在使用的是Python2.6,由于库和遗留兼容性,我将在可预见的未来使用它 目前我想做的就是在代码中添加一些消息,在调试特定区域时,我可以一节一节地打开和关闭这些消息。作为一个“hello_log

到目前为止,我一直在我的代码中添加“打印调试消息”甚至“如果条件:打印调试消息”。但是很多人告诉我这不是最好的方法,我真的应该学习如何使用日志模块。在快速阅读之后,它似乎做了我可能想要的一切,然后是一些。它本身看起来像一个学习项目,我现在想做其他项目,只需使用最小的功能来帮助我。如果有什么不同的话,我现在使用的是Python2.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调用的注释,所有四个都会得到输出

我是否试图在一个过于简单的层次上运行它


为了获得预期的行为,我可以在那里编写的内容中添加什么最简单的内容?

日志实际上遵循一个特定的层次结构(
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
语句:)