📚 Linux Logrotate 日志轮转详解
Logrotate 是 Linux 系统中用于自动化管理日志文件的工具,通过轮转(重命名/压缩旧日志)、清理过期日志和创建新日志文件,防止日志无限增长导致磁盘空间耗尽。以下从核心原理、配置实战、生产案例到运维实践全面解析。
🔧 一、核心机制与工作原理
-
触发方式
- 定时任务驱动:默认由
/etc/cron.daily/logrotate脚本每日触发,读取全局配置/etc/logrotate.conf和子配置/etc/logrotate.d/*。 - 手动触发:
logrotate -f /etc/logrotate.d/nginx # 强制轮转 logrotate -d /etc/logrotate.d/nginx # 调试模式(模拟执行)
- 定时任务驱动:默认由
-
轮转核心流程
- 重命名旧日志:如将
app.log重命名为app.log.1(若启用dateext则用日期后缀,如app.log-20250803)。 - 创建新日志文件:默认使用
create策略新建空日志文件,继承原权限(需应用程序支持重开日志)。 - 压缩与清理:压缩旧日志(如
app.log.1.gz),删除超期文件(按rotate保留数量控制)。 - 信号通知服务:通过
postrotate脚本(如kill -USR1)通知服务(如 Nginx)重新打开日志文件。
- 重命名旧日志:如将
-
关键技术原理
- inode 机制:重命名日志文件不改变 inode 号,应用程序通过原 inode 持续写入,直到收到信号重开文件。
- 低风险截断:对不支持信号重启的服务(如 Java 应用),使用
copytruncate策略(先复制后清空原文件),但可能丢失少量日志。
⚙️ 二、配置文件详解
Logrotate 配置分为全局配置(/etc/logrotate.conf)和应用子配置(/etc/logrotate.d/*)。子配置优先级更高,常用参数如下:
| 配置指令 | 作用 | 示例值 |
|---|---|---|
daily/weekly/monthly |
轮转频率 | daily |
rotate N |
保留历史日志数量 | 7(保留7份) |
size 100M |
按大小触发轮转(优先级高于时间) | size 100M |
compress |
启用 gzip 压缩旧日志 | compress |
delaycompress |
延迟一轮再压缩(与 compress 联用) |
delaycompress |
missingok |
日志不存在时不报错 | missingok |
notifempty |
空日志文件不轮转 | notifempty |
create MODE OWNER GROUP |
创建新日志文件的权限、所有者和组 | create 640 nginx nginx |
copytruncate |
复制后截断原文件(替代 create,兼容性高但可能丢数据) |
copytruncate |
dateext |
使用日期后缀命名历史日志(默认数字递增) | dateext |
sharedscripts |
多个日志共享同一个 postrotate 脚本(避免重复执行) |
sharedscripts |
postrotate/endscript |
轮转后执行的命令(如重启服务) | 见下文案例 |
🛠️ 三、生产级配置示例
-
Nginx 日志轮转
/var/log/nginx/*.log { daily rotate 30 compress delaycompress missingok notifempty dateext dateformat -%Y%m%d # 日期格式:-20250803 create 640 nginx adm sharedscripts postrotate # 向 Nginx 主进程发送 USR1 信号,重开日志文件 kill -USR1 $(cat /run/nginx.pid) endscript }关键点:
- 使用
create确保数据完整性,需 Nginx 支持信号重启。 sharedscripts避免多个日志文件重复触发脚本。
- 使用
-
高并发服务日志(如 MySQL)
/var/log/mysql/slow.log { size 1G # 按大小轮转(避免突发流量撑爆磁盘) rotate 10 compress nodelaycompress # 立即压缩 copytruncate # 避免重启数据库 missingok }场景适配:数据库服务重启成本高,
copytruncate更安全,但需容忍微量日志丢失风险。 -
多日志文件统一管理
/var/log/app/*.log /var/log/app/*.debug { weekly rotate 4 compress missingok sharedscripts postrotate systemctl restart app-service endscript }提示:通配符匹配多个日志,
sharedscripts确保所有日志轮转后仅执行一次重启命令。
🚀 四、运维最佳实践
-
权限与安全
- 日志目录权限设为
640(用户可写,组可读,其他无权限)。 - 敏感日志用
chattr +i防止误删(需在轮转前chattr -i)。
- 日志目录权限设为
-
监控与调试
- 检查轮转状态:
cat /var/lib/logrotate/status # 记录各日志上次轮转时间 - 日志异常排查:
- 未轮转:检查 cron 任务、文件大小是否达标、权限是否正确。
- 轮转后服务异常:验证
postrotate脚本是否生效(如nginx -t测试配置)。
- 检查轮转状态:
-
高级策略
- 混合触发条件:同时配置
daily和size 100M,满足任一条件即触发轮转。 - 企业级扩展:
- 使用
olddir /backup/logs将历史日志存储到独立分区。 - 对接 ELK 栈:轮转后通过脚本将日志发送到 Logstash 集中分析。
- 使用
- 混合触发条件:同时配置
⚠️ 五、常见问题与解决
| 问题现象 | 原因 | 解决方案 |
|---|---|---|
| 轮转后日志停止写入 | 未重启服务或 create 权限错误 |
检查 postrotate 脚本或改用 copytruncate |
| 历史日志未压缩 | compress 与 delaycompress 冲突 |
移除 delaycompress 或调整顺序 |
| 轮转后服务崩溃 | postrotate 脚本命令错误 |
用 logrotate -d 调试脚本逻辑 |
| 磁盘空间仍不足 | rotate 值过大或未启用压缩 |
减少保留份数,启用 compress |
💎 总结
Logrotate 通过自动化轮转机制平衡了日志完整性、存储效率与运维便捷性:
-
核心价值:避免磁盘爆满、加速日志检索、支持审计合规。
-
配置铁律:高频日志用
daily+size双触发;关键服务优先create;海量日志必开compress。 -
终极建议:生产环境配置后务必用
logrotate -d -f模拟测试,并通过tail -f实时监控日志连续性。
注:本文内容综合自多个权威来源,更多参数细节可参考 Logrotate 官方文档 或 。
浙公网安备 33010602011771号