在之前的文章中,我们学习了关于Python
日志记录的基础配置
。
本文将深入探讨Python
中的日志回滚机制,这是一种高效管理日志文件的方法,特别适用于长时间运行或高流量的应用。
模块 | 释义 |
---|---|
logging |
Python 的日志记录工具,标准库 |
RotatingFileHandler |
基于文件大小进行日志回滚的处理器。 |
TimedRotatingFileHandler |
基于时间间隔进行日志回滚的处理器。 |
导入模块
import logging
from logging.handlers import (RotatingFileHandler, TimedRotatingFileHandler)
文章脉络:
在Python
中,日志回滚通常通过logging.handlers
模块中的RotatingFileHandler
或TimedRotatingFileHandler
实现。
通过灵活地使用Logger和多个Handler,可以构建一个强大而灵活的日志系统,它可以同时满足日志记录的多样化需求,如日志的级别、格式、输出目的地等,从而为应用程序的监控和故障排查提供强有力的支持。
Logger(日志记录器)
Handler(日志处理器)
StreamHandler
(控制台输出)、FileHandler
(写入文件)、RotatingFileHandler
(基于文件大小回滚的文件写入)、TimedRotatingFileHandler
(基于时间间隔回滚的文件写入)等。多处理器配置
StreamHandler
)和文件(使用FileHandler
或RotatingFileHandler
)。值得注意的是,这里的设置日志级别和日志格式,与前文的
basicConfig
是不一样滴~,细看下文!!!
设置日志回滚的步骤如下:
Formatter
对象,指定日志消息的格式;FileHandler
、RotatingFileHandler
等;root logger
logger = logging.getLogger(name="my_application_logger")
logger.setLevel(logging.INFO)
Formatter
对象,定义日志消息的输出格式。这可以包括时间戳、日志级别、消息等。formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
根据需要选择适当的处理器,
对于基于文件大小的回滚:
RotatingFileHandler
,设置最大文件大小和备份文件数量。rotating_handler = RotatingFileHandler("my_log.log", maxBytes=1024*1024, backupCount=5)
rotating_handler.setFormatter(formatter)
对于基于时间的回滚:
TimedRotatingFileHandler
,设置回滚时间(如午夜)、间隔和备份文件数量。timed_handler = TimedRotatingFileHandler("my_log.log", when="midnight", interval=1, backupCount=7)
timed_handler.setFormatter(formatter)
日志处理器
也没任何问题~logger.addHandler(rotating_handler)
logger.addHandler(timed_handler)
logger.info("This is a test log message.")
import os
import glob
import time
log_dir = '/logs'
# 查找目录中所有扩展名为.log的文件
log_files = glob.glob(os.path.join(log_dir, '*.log'))
for log_file in log_files:
# 检查文件的最后修改日期
# 判断文件的最后修改时间是否早于当前时间7天(7 * 24 * 3600秒)
if os.path.getmtime(log_file) < (time.time() - 7 * 24 * 3600):
os.remove(log_file)
RotatingFileHandler
是用于基于文件大小的日志回滚。当日志文件达到指定大小时,它会自动 回滚
日志文件。
主要参数:
'a'
,表示追加模式。其他常见模式包括 'w'
(写模式,每次启动时覆盖文件)。app.log.1
, app.log.2
…basicConfig
。emit()
方法时才会创建文件。即直到日志系统实际写入消息时才创建文件,避免创建空日志文件basicConfig
。示例代码
import logging
from logging.handlers import RotatingFileHandler
# 创建日志记录器,设置日志级别为INFO
logger = logging.getLogger("my_app_logger")
logger.setLevel(logging.INFO)
# 创建 RotatingFileHandler
# 设置文件最大大小为1MB,最多保留3个备份
handler = RotatingFileHandler("./logs/app.log", maxBytes=1024*1024, backupCount=3)
handler.setLevel(logging.INFO)
# 创建日志格式并设置给处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 将处理器添加到日志记录器
logger.addHandler(handler)
# 记录一些示例日志
for i in range(1000):
logger.info(f"This is log message {i}")
TimedRotatingFileHandler
用于基于时间的日志回滚。根据指定的时间间隔回滚日志文件。
主要参数:
'S'
(秒),'M'
(分钟),'H'
(小时),'D'
(天),'W0'-'W6'
(周一至周日),'midnight'
(每天午夜)。when
参数一起使用。例如,when='H'
和interval=6
表示每6小时回滚一次日志文件。basicConfig
。emit()
方法时才会创建文件。即直到日志系统实际写入消息时才创建文件,避免创建空日志文件True
,则时间间隔的计算基于UTC时间。默认为False
,基于本地时间。when
设置为'midnight'
,这个参数可以用来指定回滚发生的具体时间。basicConfig
。示例代码
import logging
from logging.handlers import TimedRotatingFileHandler
# 创建日志记录器,设置日志级别为INFO
logger = logging.getLogger("my_app_logger")
logger.setLevel(logging.INFO)
# 创建 TimedRotatingFileHandler
# 设置每天午夜回滚一次日志,保留最多7个备份
handler = TimedRotatingFileHandler("./logs/app.log", when="midnight", interval=1, backupCount=7)
handler.setLevel(logging.INFO)
# 创建日志格式并设置给处理器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 将处理器添加到日志记录器
logger.addHandler(handler)
# 记录一些示例日志
for i in range(1000):
logger.info(f"This is log message {i}")
日志处理器 | 应用场景 | 优势 |
---|---|---|
RotatingFileHandler | - 日志活动频繁但数据量可预测的环境 - 控制日志文件大小,避免单个文件过大 |
- 防止日志文件过大,便于文件传输和查看 - 适合稳定的日志输出环境 |
TimedRotatingFileHandler | - 需要按时间周期归档日志的情况 - 定期审查或归档日志,如审计和系统监控 |
- 根据时间自动组织日志文件 - 便于日志的定期查找和分析 |
本文详细探讨了Python
中的日志回滚机制,包括RotatingFileHandler
和TimedRotatingFileHandler
两种关键的日志处理器。这些处理器不仅增强了日志系统的灵活性,还大大简化了日志管理,特别适用于长时间运行或高流量的应用。
日志回滚是一种高效的日志管理技术,能够自动控制日志文件的大小和生命周期。通过正确使用RotatingFileHandler
和TimedRotatingFileHandler
,我们可以为应用程序提供稳定、可靠的日志记录机制,保障应用程序的健康运行。
本次分享到此结束,
see you~