Linux 的日志轮转(Log Rotation)机制主要通过 logrotate 工具实现,其核心目标是管理日志文件的大小和数量,防止磁盘空间被占满,同时保留历史日志便于后续排查。以下是其工作原理的详细说明:
1. 核心工具:logrotate
logrotate 是 Linux 系统预装的日志管理工具,通过定时任务(如每日 cron 任务 /etc/cron.daily/logrotate
)或手动执行 logrotate /etc/logrotate.conf
触发。它的行为由配置文件定义。
2. 配置文件
- 主配置文件:
/etc/logrotate.conf
,定义全局默认参数。 - 子配置文件:在
/etc/logrotate.d/
目录下,每个应用(如 Nginx、Apache)通常有自己的独立配置文件。
示例配置片段(以 Nginx 为例):
/var/log/nginx/*.log {
daily # 按天轮转
missingok # 日志不存在时不报错
rotate 7 # 保留最近7次轮转的日志
compress # 压缩旧日志(默认用 gzip)
delaycompress # 延迟压缩前一个轮转的日志(方便排查旧日志)
notifempty # 空日志不轮转
create 0640 www-data adm # 新日志文件的权限、属主和属组
sharedscripts # 所有日志处理完再执行脚本
postrotate
systemctl reload nginx >/dev/null 2>&1 # 触发应用重新打开日志文件
endscript
}
3. 日志轮转的典型流程
当触发轮转时,logrotate 按以下步骤处理日志文件:
- 检查条件:根据配置(如
daily/weekly/monthly
、size
参数)判断是否需要轮转。 - 重命名旧日志:
- 若当前日志是
access.log
,次轮转后变为access.log.1
。 - 后续轮转会依次滚动重命名(如
access.log.1
→access.log.2
)。
- 若当前日志是
- 创建新日志文件:
- 通过
create
指令新建空日志文件,或使用copytruncate
复制当前日志后清空原文件(避免重启应用)。
- 通过
- 处理旧日志:
- 删除超过
rotate
指定数量的最旧日志(如rotate 7
会删除access.log.8
)。 - 根据
compress
压缩旧日志(如生成.gz
文件)。
- 删除超过
- 执行自定义脚本:
- 通过
postrotate/endscript
块通知应用重新加载日志文件(如向 Nginx 发送reload
信号)。
- 通过
4. 关键参数解析
| 参数 | 作用 |
|------------------|----------------------------------------------------------------------|
| daily/weekly/monthly
| 按时间周期触发轮转 |
| size 100M
| 当日志大小超过指定值时触发轮转 |
| rotate N
| 保留 N 次轮转的旧日志 |
| compress
| 启用 gzip 压缩旧日志 |
| delaycompress
| 延迟压缩前一个轮转的日志(需与 compress
配合) |
| missingok
| 日志文件不存在时不报错 |
| notifempty
| 空日志不轮转 |
| create
| 轮转后创建新日志并设置权限/属主 |
| copytruncate
| 复制日志后清空原文件(无需重启应用,但可能丢失部分日志) |
| postrotate
| 轮转后执行的脚本(如通知应用重新打开日志) |
5. 处理正在写入的日志文件
- 推荐方式:通过
postrotate
脚本通知应用重新打开日志文件(如kill -HUP
或systemctl reload
),确保后续日志写入新文件。 - 替代方案:使用
copytruncate
直接复制并清空原文件,但可能在复制和清空之间有少量日志丢失。
6. 调试与手动执行
- 调试配置:
logrotate -d /path/to/config
(模拟运行,显示详细过程但不修改文件)。 - 强制轮转:
logrotate -vf /path/to/config
(强制执行并显示详细信息)。
通过这种机制,Linux 系统能够自动化地管理日志文件,平衡存储空间与历史日志保留的需求。
(本文来源:nzw6.com)