news 2026/5/30 16:41:54

Python日志轮转策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python日志轮转策略

# Python 日志轮转策略 — FileHandler / TimedRotating / logrotate
# 生产环境日志管理方案,避免磁盘写满

import logging
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler, WatchedFileHandler
import os

LOG_DIR = "/var/log/python-app"
os.makedirs(LOG_DIR, exist_ok=True)

# 1. RotatingFileHandler — 按大小轮转(10MB,保留 5 个备份)
rotating_handler = RotatingFileHandler(
filename=os.path.join(LOG_DIR, "app.log"),
mode="a",
maxBytes=10 * 1024 * 1024,
backupCount=5,
encoding="utf-8",
)
# app.log -> app.log.1 -> ... app.log.5(丢弃最旧)

# 2. TimedRotatingFileHandler — 按时间轮转(午夜,保留 30 天)
timed_handler = TimedRotatingFileHandler(
filename=os.path.join(LOG_DIR, "app-timed.log"),
when="midnight",
interval=1,
backupCount=30,
encoding="utf-8",
utc=True,
)
# when: "S"秒 "M"分 "H"时 "D"天 "midnight"午夜 "W0"~"W6"每周

# 3. WatchedFileHandler — 配合外部 logrotate
watched_handler = WatchedFileHandler(
filename=os.path.join(LOG_DIR, "app-watched.log"),
mode="a",
encoding="utf-8",
)

# 格式化与配置
formatter = logging.Formatter(
fmt="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
for h in [rotating_handler, timed_handler, watched_handler]:
h.setFormatter(formatter)

logger = logging.getLogger(__name__)
for h in [rotating_handler, timed_handler, watched_handler]:
logger.addHandler(h)
logger.setLevel(logging.DEBUG)
logger.info("日志系统已初始化,支持大小轮转、时间轮转和外部 logrotate")

# ========== 系统 logrotate 配置(/etc/logrotate.d/python-app)==========
# /var/log/python-app/*.log {
# daily # 每天轮转
# rotate 30 # 保留 30 天
# compress # gzip 压缩
# delaycompress # 延迟一天
# missingok # 文件缺失不报错
# copytruncate # 复制并截断(无需重启应用)
# size 100M # 超过 100M 也触发
# }

# 测试:logrotate -d /etc/logrotate.d/python-app
# 强制:logrotate -f /etc/logrotate.d/python-app

# copytruncate:logrotate 复制文件 -> 截断原文件 ->
# Python 继续写入原 inode,无需信号通知

# ========== 完整生产配置(字典模式)==========
def setup_logging():
config = {
"version": 1,
"formatters": {
"standard": {"format": "%(asctime)s [%(levelname)s] %(name)s: %(message)s"},
"json": {"format": '{"time":"%(asctime)s","level":"%(levelname)s","message":"%(message)s"}'},
},
"handlers": {
"rotating": {
"class": "logging.handlers.RotatingFileHandler",
"filename": os.path.join(LOG_DIR, "app.log"),
"maxBytes": 10 * 1024 * 1024,
"backupCount": 5,
"formatter": "json",
},
"error": {
"class": "logging.handlers.TimedRotatingFileHandler",
"filename": os.path.join(LOG_DIR, "error.log"),
"when": "midnight",
"backupCount": 90,
"level": "ERROR",
"formatter": "standard",
},
},
"loggers": {
"": {"handlers": ["rotating", "error"], "level": "DEBUG"},
"sqlalchemy": {"level": "WARNING"},
},
}
logging.config.dictConfig(config)

# ========== 关键要点 ==========
# RotatingFileHandler:按大小轮转,maxBytes + backupCount 控制总空间。
# TimedRotatingFileHandler:按时间轮转,适合合规保留要求。
# WatchedFileHandler:配合外部 logrotate,无需重启应用。
# 系统 logrotate:独立轮转方案,copytruncate 无需信号通知。
# 分层配置:不同级别分离,不同格式(可读 vs JSON)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 16:41:16

从Arduino到STM32:手把手移植这个轻量级任务调度器(附内存占用分析)

从Arduino到STM32:轻量级任务调度器的跨平台移植与优化实践 在嵌入式开发领域,任务调度器作为协调多任务执行的核心组件,其性能直接影响系统响应速度和资源利用率。本文将深入探讨如何将基于C14的轻量级任务调度器从Arduino平台无缝移植到STM…

作者头像 李华
网站建设 2026/5/30 16:40:38

别只看参数!深入Flight Stand 150测试台软件:如何用它的脚本和API为你的eVTOL动力系统“体检”

解锁Flight Stand 150测试台的隐藏能力:用脚本与API重构eVTOL动力验证流程当实验室的工程师们第一次接触Flight Stand 150测试台时,往往会被其精密的硬件参数所吸引——150kg的负载能力、1000Hz的采样率、四通道同步测试...这些数字确实令人印象深刻。但…

作者头像 李华
网站建设 2026/5/30 16:39:47

电路设计入门:从电压电流到光控LED夜灯实战

1. 项目概述:为什么电路设计是硬件开发的基石 如果你拆开任何一个电子设备,无论是手机、电脑,还是一个简单的电子闹钟,映入眼帘的都是一块布满各种微小元件的电路板。这些元件通过铜线连接,构成了一个精密的系统&#…

作者头像 李华
网站建设 2026/5/30 16:39:34

保姆级教程:长虹CM201-2盒子刷当贝纯净桌面,附详细短接图与文件清单

长虹CM201-2盒子刷机实战:从拆机短接到当贝桌面完美部署 第一次给电视盒子刷机就像给老房子翻新——既期待焕然一新的体验,又担心操作不当导致"房子塌了"。作为曾经亲手把三个不同型号盒子刷成砖又救回来的技术宅,我特别理解新手面…

作者头像 李华
网站建设 2026/5/30 16:38:52

从FPGA项目到IC设计岗:一位24届硕士的校招避坑指南与真实面经复盘

从FPGA到数字IC设计:24届硕士的转型策略与面试实战指南 在半导体行业蓬勃发展的当下,越来越多的FPGA工程师开始将目光投向数字IC设计领域。这种职业转型看似顺理成章——两者都涉及硬件描述语言和数字电路设计,但实际上存在诸多认知盲区和技术…

作者头像 李华
网站建设 2026/5/30 16:37:56

从单机到三节点集群:手把手教你用DBeaver管理新部署的Apache Doris

从单机到三节点集群:DBeaver实战Apache Doris全生命周期管理 当三台服务器的Doris服务终于启动完成,大多数教程的终点恰恰是实际工作的起点。作为经历过数十次Doris部署的资深DBA,我深知集群搭建成功后的头30分钟操作,往往决定了整…

作者头像 李华