📅  最后修改于: 2023-12-03 14:46:18.414000             🧑  作者: Mango
在编写代码时,我们可能需要了解程序在运行时的细节,比如变量的值、函数的调用情况等。为了方便地记录这些信息,Python 提供了记录器(logger)的功能,可以将程序运行时的信息输出到控制台或者文件中,以便后续查看和分析。
使用记录器的第一步是导入 logging
模块,并创建一个记录器对象:
import logging
logger = logging.getLogger(__name__)
其中,__name__
是 Python 内置的变量,表示当前模块的名字。创建记录器对象之后,就可以通过记录器对象调用各种方法输出日志信息了:
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')
有五种不同的日志级别,分别是 DEBUG
、INFO
、WARNING
、ERROR
和 CRITICAL
,级别越高表示日志越重要。当我们设置记录器的级别时,只有级别大于等于该级别的日志信息才会被输出。默认情况下,记录器的级别是 WARNING
,即只输出级别为 WARNING
、ERROR
和 CRITICAL
的信息。
一般来说,在程序中需要根据实际情况来灵活地设置记录器的级别。比如,在开发阶段可以将记录器的级别设置为 DEBUG
,以便调试代码时输出更详细的信息;而在发布阶段可以将记录器的级别设置为 WARNING
或者更高级别,只输出重要的问题信息。
另外,我们还可以为记录器设置处理器和格式化器,定制日志信息的输出格式和存储位置。这里不再展开介绍,感兴趣的读者可以自行查阅相关文档。
有时候,我们可能需要在一段代码的多个地方输出相同的日志信息。比如,我们想输出一条日志信息,表示程序启动成功,可以这么写:
logger.info('程序启动成功')
但是,如果在不同的地方都想输出这条信息,就需要重复这个调用,会显得冗余且难以维护。这时候,我们可以考虑使用记录器的 addFilter
方法来实现打印多次的效果。
具体来说,我们可以创建一个过滤器(filter)对象,重载 filter
方法,判断是否输出日志信息。然后将该过滤器对象添加到记录器中,就可以在多个地方共享这个过滤器了。这样,只要在记录器中添加了该过滤器,就可以在任意位置重复调用记录器的输出方法,而且只有在第一次输出时才会真正输出日志信息。
下面是一个简单的示例代码,展示了如何实现打印多次效果:
class Filter:
def __init__(self):
self.first_time = True
def filter(self, record):
if self.first_time or record.getMessage() != '程序启动成功':
self.first_time = False
return True
else:
return False
logger = logging.getLogger(__name__)
filter = Filter()
logger.addFilter(filter)
logger.info('程序启动成功')
logger.info('程序启动成功')
logger.info('程序启动成功')
在这个示例中,我们创建了一个 Filter
类,实现了 filter
方法,并在其中维护了一个布尔值 first_time
,表示是否为第一次输出日志信息。在 filter
方法中,我们判断当前是否为第一次输出,以及当前日志信息是否为“程序启动成功”这条信息。如果是第一次输出或者日志信息不是“程序启动成功”,就返回 True
,表示允许输出日志信息;否则返回 False
,表示禁止输出日志信息。
在创建完 Filter
对象之后,将它添加到记录器中,就可以实现打印多次的效果。在后续的输出调用中,只需要简单地调用记录器的输出方法即可。
Python 的记录器功能可以方便地记录程序运行时的信息。通过灵活设置记录器的级别、处理器和格式化器,可以实现各种不同的日志处理需求。而使用 addFilter
方法可以在多个地方共享打印效果,从而提高代码的复用性和可维护性。