Python logging实现日志滚动与过期清理详解
本文详解Python中logging模块的日志滚动机制,重点介绍TimeRotatingFileHandler的使用。通过配置when、interval和backupCount参数实现按时间周期生成日志文件,并解析suffix与extMatch正则匹配规则,确保过期日志能被正确清理,避免磁盘空间耗尽。
Python日志滚动机制概述
Python的logging库提供了两种用于日志滚动的处理器类(参考官方文档https://docs.python.org/2/library/logging.handlers.html):RotatingFileHandler依据文件大小进行滚动,而TimeRotatingFileHandler依据时间周期进行滚动。在实际生产环境中,基于时间的滚动更为常用,因此本文将重点讲解TimeRotatingFileHandler的配置方法(RotatingFileHandler的使用逻辑类似)。具体代码示例如下:
#!/usr/bin/env python
#_*_coding:utf-8_*_
# vim : set expandtab ts=4 sw=4 sts=4 tw=100 :
import logging
import time
import re
from logging.handlers import TimedRotatingFileHandler
from logging.handlers import RotatingFileHandler
def main():
#日志打印格式
log_fmt = '%(asctime)s\tFile \"%(filename)s\",line %(lineno)s\t%(levelname)s: %(message)s'
formatter = logging.Formatter(log_fmt)
#创建TimedRotatingFileHandler对象
log_file_handler = TimedRotatingFileHandler(filename="ds_update", when="M", interval=2, backupCount=2)
#log_file_handler.suffix = "%Y-%m-%d_%H-%M.log"
#log_file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}.log$")
log_file_handler.setFormatter(formatter)
logging.basicConfig(level=logging.INFO)
log = logging.getLogger()
log.addHandler(log_file_handler)
#循环打印日志
log_content = "test log"
count = 0
while count < 30:
log.error(log_content)
time.sleep(20)
count = count + 1
log.removeHandler(log_file_handler)
if __name__ == "__main__":
main()
TimeRotatingFileHandler核心参数配置
filename:指定日志文件名的前缀部分;
when:定义滚动周期的基本时间单位,其可选字符串值及对应含义如下:
“S”:表示秒(Seconds)
“M”:表示分钟(Minutes)
“H”:表示小时(Hours)
“D”:表示天(Days)
“W”:表示星期几(0代表周一)
“midnight”:表示在午夜时刻进行滚动
interval:滚动周期的数值,单位由when参数决定。例如,当when='D'且interval=1时,表示每天生成一个新的日志文件; backupCount:指定保留的历史日志文件的数量;
后缀匹配与过期清理机制
除了上述基础参数外,TimedRotatingFileHandler类还包含两个关键成员变量:suffix和extMatch。suffix用于定义日志文件名的后缀,通常包含格式化的时间字符串,最终文件名由filename和suffix通过“.”连接而成(例如,若filename=“runtime”且suffix=“%Y-%m-%d.log,生成的文件名将为runtime.2015-07-06.log))。extMatch是一个预编译的正则表达式,用于匹配日志文件名的后缀格式,它必须与suffix的定义严格匹配。如果suffix与extMatch无法匹配,系统将无法识别并删除过期日志。例如,当suffix=“%Y-%m-%d.log”时,extMatch应设置为re.compile(r”^\d{4}-\d{2}-\d{2}.log$”)。默认情况下,在TimedRotatingFileHandle对象初始化时,系统会根据when的值自动初始化suffxi和extMatch:
‘S': suffix=”%Y-%m-%d_%H-%M-%S”, extMatch=r”\^d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}”;
‘M':suffix=”%Y-%m-%d_%H-%M”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}”;
‘H':suffix=”%Y-%m-%d_%H”,extMatch=r”^\d{4}-\d{2}-\d{2}_\d{2}”;
‘D':suffxi=”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;
‘MIDNIGHT':”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;
‘W':”%Y-%m-%d”,extMatch=r”^\d{4}-\d{2}-\d{2}”;
如果用户对日志文件名格式没有特殊要求,可以不手动设置suffix和extMatch;若需自定义格式,务必确保两者之间能够正确匹配。
总结
总结
以上内容介绍了Python中利用logging模块实现日志滚动及过期日志自动删除的功能,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编将及时回复!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













