python logging TimedRotatingFileHandler backupCount不生效问题解决

背景

在 python 开发过程中使用 logging 记录日志是很常见的做法;

但在一些情况下,由于使用 TimedRotatingFileHandler 按时间分割日志文件时设置的频率太高,

会导致 log 文件过多,从而难以查询日志结果,所以使用 backupCount 参数控制日志文件的数量。

但有时即便使用了 suffix 和 extMatch 匹配 log 文件分割时的后缀格式, backupCount 依然会不生效。

以下将记录此问题的解决过程。

错误案例

python 复制代码
import logging.handlers
import re

import datetime as dt
import time

# 格式控制器
formatter = logging.Formatter(fmt="%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s")

# 定义日志处理器console_handler
console_handler = logging.StreamHandler()

# 3.设置处理器日志级别
console_handler.setLevel(logging.DEBUG)

# 给处理器传入格式器
console_handler.setFormatter(formatter)

# 添加TimedRotatingFileHandler
timed_handler = logging.handlers.TimedRotatingFileHandler(
    filename="log/nicole.log",
    when='S',  # S秒 M分 H时 D天 W周 按时间切割 测试选用S
    interval=30,
    backupCount=4,
    encoding="utf8"
)

# 设置后缀名称
timed_handler.suffix = "%Y-%m-%d_%H-%M-%S.log"
# 正则表达式 与 suffix 格式对应
timed_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}.log$")
timed_handler.setFormatter(formatter)

timed_handler.setLevel(logging.INFO)

# 创建一个日志记录器,就是一个logger对象
logger = logging.getLogger(__name__)

# 设置logger日志记录器的日志级别为DEBUG
logger.setLevel(logging.DEBUG)

# 把两个处理器添加到日志记录器中
logger.addHandler(console_handler)
logger.addHandler(timed_handler)

for i in range(1200):
    logger.info(dt.datetime.now())
    time.sleep(1)

在大部分使用过程中,会添加 console_handler 用于在控制台打印日志;添加 timed_handler 用于生产 .log 文件打印日志;

这里的重点是 timed_handler 对象的配置;

在一般情况下,为了 log 文件命名长度会使用 .suffix 配置后缀,然后使用 .extMatch 匹配需要控制数量的 .log 文件的后缀;

期望是 .extMatch 能删除数量超过 backupCount 的文件,但多次运行后,发现文件数量并没有被控制。

extMatch匹配验证

extMatch 正则表达式能够匹配到 生成后的日志后缀

修改后代码

python 复制代码
import logging.handlers
import re

import datetime as dt
import time

# 格式控制器
formatter = logging.Formatter(fmt="%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s")

# 定义日志处理器console_handler
console_handler = logging.StreamHandler()

# 3.设置处理器日志级别
console_handler.setLevel(logging.DEBUG)

# 给处理器传入格式器
console_handler.setFormatter(formatter)

# 添加TimedRotatingFileHandler
timed_handler = logging.handlers.TimedRotatingFileHandler(
    filename="log/nicole.log",
    when='S',  # S秒 M分 H时 D天 W周 按时间切割 测试选用S
    interval=30,
    backupCount=4,
    encoding="utf8"
)

# -- 修改位置 将 suffix 和 extMatch 中的 .log 去掉,并仍然保持匹配--
# 设置后缀名称
timed_handler.suffix = "%Y-%m-%d_%H-%M-%S"
# 正则表达式 与 suffix 格式对应
timed_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$")

timed_handler.setFormatter(formatter)

timed_handler.setLevel(logging.INFO)

# 创建一个日志记录器,就是一个logger对象
logger = logging.getLogger(__name__)

# 设置logger日志记录器的日志级别为DEBUG
logger.setLevel(logging.DEBUG)

# 把两个处理器添加到日志记录器中
logger.addHandler(console_handler)
logger.addHandler(timed_handler)

for i in range(1200):
    logger.info(dt.datetime.now())
    time.sleep(1)

去掉 suffix 和 extMatch里面 .log 代码重新运行,能够查看到文件数量被控制在 backupCount 内。

相关推荐
程序员小远18 小时前
软件测试之单元测试详解
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
心无旁骛~19 小时前
python多进程和多线程问题
开发语言·python
星云数灵19 小时前
使用Anaconda管理Python环境:安装与验证Pandas、NumPy、Matplotlib
开发语言·python·数据分析·pandas·教程·环境配置·anaconda
计算机毕设匠心工作室19 小时前
【python大数据毕设实战】青少年抑郁症风险数据分析可视化系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习
后端·python
计算机毕设小月哥19 小时前
【Hadoop+Spark+python毕设】智能制造生产效能分析与可视化系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
计算机毕设小月哥21 小时前
【Hadoop+Spark+python毕设】中风患者数据可视化分析系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
Keep_Trying_Go1 天前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计
计算机毕设匠心工作室1 天前
【python大数据毕设实战】强迫症特征与影响因素数据分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
Trouville011 天前
Pycharm软件初始化设置,字体和shell路径如何设置到最舒服
ide·python·pycharm