在开发应用程序时,为了快速排错以及跟踪程序的执行流程,我们需要在应用程序中添加日志记录。Python提供的日志处理模块——Logging,可以轻松实现高效记录应用程序中的事件。Logging模块不仅支持将日志记录保存到文件中,还支持输出到控制台、邮件、网络等,并且提供了日志级别、过滤、格式化等功能,大大提高了日志的可读性和可维护性。
一、Logging模块基础
Python Logging模块的基础是Logger类。Logger实例表示一个可命名的记录器,Logger实例可以设置级别(默认为WARNING)、处理器以及过滤器来处理记录器传递来的日志消息。每个Logger实例都有一个等级阈值(或简称等级),只有等级大于或等于此阈值的记录才会被处理,等级高的记录将比等级低的记录更严重。
Logger可以保留一个可选的重要任何数量的处理器对象。当提交一条记录时,记录器将所有传递给自己的信息传递给所有关联的处理器进行处理。
下面的代码演示了如何创建一个Logger对象:
import logging logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # 设置日志记录的等级
在上面的代码中,我们首先导入了Python Logging模块。然后使用getLogger()方法创建了一个名为my_logger的Logger实例对象,并将日志记录等级设置为DEBUG。
二、日志处理器Handler
Logger用于提供接口,用于发送信息到日志系统中。然而,它不能直接将信息写入文件、网络等。这时候就需要使用处理器对象——Handler。它负责将特定的日志消息发送到特定的输出位置,比如文件、终端、邮件等。
下面是一个使用FileHandler将日志记录写入文件的示例:
import logging logger = logging.getLogger('my_logger') handler = logging.FileHandler('my_log.log') formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.INFO) logger.info('Hello, logging!')
在上面的代码中,我们首先创建了Logger实例对象和FileHandler对象。然后,我们使用setFormatter()方法为handler添加格式化程序。最后,通过addHandler()方法将handler对象关联到Logger实例对象上,并通过info()方法进行日志输出。
三、日志格式化
Logging模块支持对日志信息进行格式化,以便更好地阅读和理解日志记录。您可以使用logging模块中的Formatter类来格式化日志记录字符串。format()方法用于格式化日志记录的字符串。
以下是一个简单的日志格式化示例:
import logging logging.basicConfig(datefmt='%m/%d/%Y %I:%M:%S %p', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') logging.warning('This is a warning') logging.error('This is an error')
在上面的代码中,我们使用basicConfig()方法进行日志格式化设置,包含日期和时间、日志记录名称、日志记录级别以及日志记录消息。最后,我们使用warning()方法和error()方法分别记录了一条警告和一条错误日志。
四、过滤器Filter
过滤器用于决定哪些日志记录应该被处理并传递给处理器。一个日志记录可能被多个处理器处理,如果您希望某些处理器只处理特定类型或级别的日志记录,则可以通过添加过滤器来实现。
import logging logger = logging.getLogger('my_logger') handler = logging.StreamHandler() handler.setLevel(logging.DEBUG) def custom_filter(record): return record.levelno == logging.INFO handler.addFilter(custom_filter) logger.addHandler(handler) logger.debug('This is a debug message') logger.info('This is an info message')
在上面的代码中,我们首先创建了Logger实例对象和StreamHandler对象,并将日志记录级别设置为DEBUG。然后,我们创建了一个自定义过滤器——custom_filter,它仅允许INFO级别的日志记录通过。最后,通过addFilter()方法将过滤器对象添加到handler对象中,并使用debug()方法和info()方法进行日志输出。
小结
Python Logging模块提供了丰富的功能来记录应用程序中的事件和异常,比如设置不同的日志级别、记录日志到文件或其他媒介、格式化日志记录以及过滤日志记录等。正确使用Logging模块可以轻松地排除应用程序错误,有助于提高应用程序的可维护性和稳定性。