Python logging.TimedRotatingFileHandler使用方法详解
作者:华丽的周遭
本文主要介绍了Python logging.TimedRotatingFileHandler使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一、TimedRotatingFileHandler 是什么?
TimedRotatingFileHandler是 Python logging模块中按时间自动切割日志文件的处理器。
✅ 常用于:
- 每天生成一个日志文件
- 每小时 / 每分钟切分日志
- 限制历史日志数量,防止磁盘爆满
📌 典型场景:
生产环境服务长期运行,日志不能只写在一个文件里。
二、基本使用方式
最简单示例
import logging
from logging.handlers import TimedRotatingFileHandler
logger = logging.getLogger("my_logger")
logger.setLevel(logging.INFO)
handler = TimedRotatingFileHandler(
filename="app.log",
when="midnight",
interval=1,
backupCount=7,
encoding="utf-8"
)
formatter = logging.Formatter(
"%(asctime)s - %(levelname)s - %(message)s"
)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("这是第一条日志")✅ 效果:
- 每天凌晨(
midnight)生成一个新日志 - 最多保留 7 天历史日志
三、参数详解(重点)
TimedRotatingFileHandler(
filename,
when='h',
interval=1,
backupCount=0,
encoding=None,
delay=False,
utc=False
)1.filename
日志文件名
- 当前写入的文件名
- 切割后会自动重命名
2.when(最重要)
when | 含义 |
|---|---|
'S' | 每秒 |
'M' | 每分钟 |
'H' | 每小时 |
'D' | 每天 |
'W0' ~ 'W6' | 周一~周日 |
'midnight' | 每天凌晨 |
✅ 常用:
when="D" # 每天 when="H" # 每小时 when="midnight" # 午夜切
3.interval
与 when配合使用
when="H", interval=6 # 每 6 小时 when="M", interval=30 # 每 30 分钟
4.backupCount
保留的历史日志数量
backupCount=7 # 只保留最近 7 个
📁 文件示例:
app.log app.log.2026-04-20 app.log.2026-04-21
5.encoding
强烈建议设置:
encoding="utf-8"
6.utc
False(默认):使用本地时间True:使用 UTC 时间
四、日志文件命名规则
假设:
filename="app.log"
时间 | 文件名 |
|---|---|
当前 | app.log |
昨天 | app.log.2026-04-26 |
前天 | app.log.2026-04-25 |
⚠️ 不会自动加日期后缀到当前文件
五、结合 logging.basicConfig 使用
import logging
from logging.handlers import TimedRotatingFileHandler
logging.basicConfig(
level=logging.INFO,
handlers=[
TimedRotatingFileHandler(
"app.log",
when="D",
interval=1,
backupCount=15,
encoding="utf-8"
)
],
format="%(asctime)s - %(levelname)s - %(message)s"
)
logging.info("服务启动")六、同时输出到控制台 + 文件(推荐)
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# 文件
file_handler = TimedRotatingFileHandler(
"app.log", when="midnight", backupCount=7, encoding="utf-8"
)
# 控制台
console_handler = logging.StreamHandler()
formatter = logging.Formatter(
"%(asctime)s - %(levelname)s - %(message)s"
)
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(console_handler)七、常见坑 & 注意事项 ⚠️
❌ 1. 多进程写同一个日志文件
TimedRotatingFileHandler不支持多进程安全
✅ 解决方案:
- 每个进程单独日志
- 使用
ConcurrentLogHandler - 或用
logrotate(Linux)
❌ 2. 修改系统时间导致切分异常
- 不建议在运行中改系统时间
- Docker / K8s 环境注意同步时间
❌ 3. 日志不立即写入
- 默认有缓冲
- 调试时可加:
handler.flush()
八、什么时候用 TimedRotatingFileHandler?
✅ 适合:
- Web 服务
- 后台任务
- 定时任务
长期运行程序
❌ 不适合:
- 超大日志量(建议
RotatingFileHandler按大小) - 多进程并发写同一文件
九、总结一句话
TimedRotatingFileHandler = 按时间自动切日志 + 控制历史数量
到此这篇关于Python logging.TimedRotatingFileHandler使用方法详解的文章就介绍到这了,更多相关Python logging.TimedRotatingFileHandler内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
