如何按大小精准切割日志脚本全攻略
目录导读
- 为什么需要按大小切割日志? - 避免磁盘爆满与性能下降的核心原因
- 主流切割工具对比 - logrotate、Python脚本、Shell脚本的优劣
- 按大小切割的经典脚本实现 - 实战代码与参数详解
- 常见问题问答 - 针对切割频率、日志丢失、权限错误的深度解答
- SEO优化与最佳实践 - 确保脚本稳定运行的黄金法则
为什么需要按大小切割日志?
在服务器运维中,日志文件会持续增长,若不限制大小,一个未切割的日志可能在几天内占用数十GB,导致:

- 磁盘空间告警,甚至系统宕机
- 日志写入速度下降,影响应用性能
- 排查问题时,单个过大的日志文件难以打开和搜索
按大小切割的优势在于:
- 提前设定阈值(如100MB),超过即自动归档
- 保留近期日志,同时压缩历史节约空间
- 通过轮转机制(如保留7天)平衡存储与查询需求
主流切割工具对比
| 工具 | 优点 | 缺点 | 典型场景 |
|---|---|---|---|
| logrotate | Linux内置,配置简单 | 默认按时间切割,需额外参数支持大小 | 日常系统维护 |
| Python脚本 | 跨平台,可定制复杂逻辑 | 依赖Python环境 | 需要多条件判断 |
| Shell+split | 轻量,无需安装 | 不支持压缩与轮转 | 临时紧急切割 |
对于按大小切割,推荐 logrotate + 自定义脚本 组合。
按大小切割的经典脚本实现
1 logrotate 方案(推荐)
配置文件 /etc/logrotate.d/myapp.conf:
/var/log/myapp/*.log {
size 100M # 关键参数:超过100MB即触发
rotate 7 # 保留最近7个归档
compress # 压缩历史文件(gzip)
missingok # 忽略日志缺失错误
notifempty # 空日志不切割
delaycompress # 延迟压缩,避免正在写入时损坏
copytruncate # 先复制再截断,保证写入不中断
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
工作原理:检查日志大小,若≥100M则执行切割:复制当前日志为 myapp.log.1,清空原文件,后续日志写入新 myapp.log。
2 Python 脚本方案(灵活定制)
import os, shutil, time, logging
from pathlib import Path
LOG_PATH = "/var/log/myapp/myapp.log"
MAX_SIZE = 100 * 1024 * 1024 # 100MB
BACKUP_COUNT = 7
def rotate_log():
if not os.path.exists(LOG_PATH):
return
if os.path.getsize(LOG_PATH) < MAX_SIZE:
return
# 轮转:删除最旧的
for i in range(BACKUP_COUNT-1, 0, -1):
old = f"{LOG_PATH}.{i}"
new = f"{LOG_PATH}.{i+1}"
if os.path.exists(old):
shutil.move(old, new)
# 重命名当前日志
if os.path.exists(LOG_PATH):
shutil.move(LOG_PATH, f"{LOG_PATH}.1")
# 创建新日志文件
open(LOG_PATH, 'a').close()
# 设置为定时任务:每5分钟检查一次
注意:该脚本需配合 crontab 定时执行,每次检查大小,避免实时检测消耗性能。
3 使用 split 命令(紧急切割)
split -b 100M /var/log/myapp/myapp.log myapp_split_ # 切割为100M分片 cat myapp_split_?? > new_log.log # 合并(需注意顺序)
局限:不保留原日志结构,无法自动轮转,仅用于一次性切割。
常见问题问答
Q1:切割时日志写入是否会中断?
A:取决于工具。logrotate 的 copytruncate 模式可以零中断:先复制文件再截断,Python脚本若直接 shutil.move 可能有短暂写入失败窗口,建议配合应用的表名操作(如 SIGHUP 信号)。
Q2:切割后的日志文件如何命名与排序?
A:myapp.log → myapp.log.1 → myapp.log.2.gz,数字越大越旧,建议开启压缩(.gz),并设置 rotate 7 最多保留7份。
Q3:如何监控切割是否成功?
A:在脚本中添加判断:
if [ $? -eq 0 ]; then
echo "$(date) Rotation success" >> /var/log/rotate.log
else
echo "$(date) Rotation failed" >&2
fi
或启用 logrotate 的 -d(调试模式)验证。
Q4:日志切割后,监控工具是否还能读取?
A:如果使用 copytruncate,原路径不变,监控工具继续读取新写入的日志,若使用 rename 模式,需要重启应用或 reload(如 kill -HUP)。
SEO优化与最佳实践
1 脚本部署建议
- 定时任务频率:按大小切割不应太密集,每10分钟执行一次检查(crontab
*/10 * * * *),若每次检查到大小条件才触发。 - 文件权限:确保运行脚本的用户对日志目录有读写权限,否则切割失败。
- 磁盘预留:留出至少20%空间,避免切割时磁盘满导致脚本异常。
2 高级优化技巧
- 秒级切割:对于高并发系统,可引入
Python的RotatingFileHandler(标准库自带),自动在写入时判断大小。 - 压缩策略:采用
pigz多核并行压缩,代替默认gzip,加快处理速度。 - 防止递归切割:在脚本中检查是否切割过(如查看
.1文件时间戳),避免日志无限增长。
3 搜索排名建议关键词本文已包含“日志切割”“按大小切割”“脚本”等核心词,结构:目录+问答+代码示例 提升用户停留时间。
- 权威性:引用 Linux 官方
man logrotate文档,增强可信度。
按大小切割日志是防止磁盘危机、保障业务连续性的关键操作,推荐在生产环境中使用 logrotate + copytruncate 组合,既稳定又高效,若需定制复杂规则(如按日期+大小双维度分割),则选择 Python 脚本,无论哪种方案,务必测试权限、压缩、轮转功能,并加入监控告警,确保日志系统健康运行。