在软件开发中,日志记录是一个至关重要的功能。它可以帮助我们追踪应用程序的运行状态、捕获错误信息以及调试程序。Python 提供了强大的 logging
模块,使得我们能够灵活地进行日志管理。本文将介绍如何通过自定义日志记录器来实现按天切分日志文件的功能,并将日志同时输出到控制台和文件中。
1. 环境准备
首先,确保你的 Python 环境已经配置好。接下来,我们将创建一个名为 CustomLogger
的类,该类将封装日志记录的相关功能。
2. 创建 CustomLogger
类
以下是 CustomLogger
类的完整代码:
import os
import logging
# TimedRotatingFileHandler 处理器允许按时间切分日志文件,用来每天生成一个新的日志文件
from logging.handlers import TimedRotatingFileHandlerclass CustomLogger:def __init__(self, log_dir='logs', log_name='app.log', level=logging.DEBUG):self.log_dir = log_dirself.log_name = log_nameself.level = level# 创建日志目录if not os.path.exists(self.log_dir):os.makedirs(self.log_dir)# 设置日志格式"""logging.Formatter 设置日志的输出格式%(asctime)s: 日志记录的时间。%(levelname)s: 日志级别(如INFO、ERROR等)。%(message)s: 日志内容。"""formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')# 创建控制台处理器"""StreamHandler 用于将日志输出到控制台setLevel 设置该处理器的日志级别,这样可以空值哪些级别的日志会被输出到控制台setFormatter 之前定义的格式应用于此处理器,以确保输出格式一致"""console_handler = logging.StreamHandler()console_handler.setLevel(self.level)console_handler.setFormatter(formatter)# 创建文件处理器,按天切分日志文件"""filename 指定完整的日志文件路径when 设置在午夜时切换到新的日志文件interval 每隔一天切换一次backupCount 如果值为0,则保存所有的日志encoding 设置文件的编码格式"""file_handler = TimedRotatingFileHandler(filename=os.path.join(self.log_dir, self.log_name),when='midnight',interval=1,backupCount=15,encoding='utf-8')file_handler.setFormatter(formatter)# 创建logger并添加处理器"""使用 getLogger() 方法创建一个名为 'CustomLogger' 的logger实例。用于获取一个日志记录器logger对象。参数CustomLogger就是记录器的名称如果指定的名称已经存在,则返回同名的记录器实例;如果不存在,则创建一个新的记录器实例。这样可以确保在整个应用程序中使用相同名称的日志记录器会共享一个实例使用 setLevel() 设置logger的级别,以控制其输出的最低级别。使用 addHandler() 方法将之前创建的控制台和文件处理器添加到logger中,这样logger就能同时向这两个目标输出日志。"""self.logger = logging.getLogger('CustomLogger')self.logger.setLevel(self.level)self.logger.addHandler(console_handler)self.logger.addHandler(file_handler)def get_logger(self):return self.logger# 使用示例
if __name__ == "__main__":logger = CustomLogger().get_logger()logger.info('This is an info message.')logger.error('This is an error message.')
代码解析
-
导入模块
首先导入必要的模块,包括os
、logging
和TimedRotatingFileHandler
。 -
初始化日志记录器
在__init__
方法中,定义了日志目录、日志文件名和日志级别。通过检查目录是否存在,若不存在则创建它。 -
设置日志格式
使用logging.Formatter
定义了日志的输出格式,包括时间戳、日志级别和日志内容。 -
创建控制台处理器
使用StreamHandler
创建控制台处理器,设置日志级别和格式,确保输出到控制台的日志符合预期。 -
创建文件处理器
使用TimedRotatingFileHandler
创建文件处理器,实现按天切分日志文件,保存最近 15 个日志文件。 -
设置 logger
使用getLogger
创建一个名为'CustomLogger'
的 logger 实例,并添加之前创建的处理器。 -
获取日志实例
提供一个get_logger
方法来获取 logger 实例,方便在其他模块中调用。
3. 使用示例
在 __main__
块中,我们实例化 CustomLogger
并记录了一条信息和一条错误日志。这些日志将被输出到控制台,同时也会保存在指定的日志文件中。
4. 总结
通过使用 Python 的 logging
模块和自定义日志记录器,我们可以方便地管理应用程序的日志记录。以上代码示例展示了如何实现按天切分日志文件的功能,并将日志信息输出到控制台和文件中。这种方法不仅使日志管理变得简单,同时也提高了日志的可读性和可追踪性。