概述
在 Linux 系统中,日志文件会随着系统运行不断增长,如果不加控制,可能导致磁盘空间耗尽、系统性能下降甚至服务异常 。为了解决这一问题,Linux 提供了 logrotate 工具,用于对日志文件进行自动轮转(rotation)、压缩、删除和归档管理。
工作原理
logrotate 的核心思想是:
在合适的时间点,将当前日志文件重命名并创建新日志文件,同时对旧日志进行压缩或删除。
其典型工作流程如下:
- 检测日志文件大小或时间
- 判断是否满足轮转条件
- 重命名当前日志文件
- 创建新的日志文件
- 执行压缩或删除策略
- 可选执行前置 / 后置脚本
logrotate 通常不是常驻进程,而是由 cron 定时任务 触发执行(如每天一次)。
配置结构
1. 主配置文件
bash
/etc/logrotate.conf
该文件定义全局默认规则,如轮转周期、压缩策略等。
2. 子配置目录
bash
/etc/logrotate.d/
该目录下通常存放各个服务的独立配置文件,如:
text
nginx
mysql
syslog
docker
logrotate 在运行时会自动加载该目录下的所有配置文件。
配置文件基本格式
conf
/var/log/nginx/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0644 nginx nginx
postrotate
systemctl reload nginx
endscript
}
配置由两部分组成:
- 日志路径
- 轮转规则块
常用配置参数
1. 轮转周期参数
| 参数 | 说明 |
|---|---|
daily |
每天轮转 |
weekly |
每周轮转 |
monthly |
每月轮转 |
yearly |
每年轮转 |
2. 轮转数量控制
rotate 7
含义:
- 保留最近 7 个历史日志
- 超过数量的旧日志会被删除
3. 按大小轮转
size 100M
当日志大小超过 100MB 时触发轮转,可与时间策略配合使用。
4. 压缩相关参数
| 参数 | 说明 |
|---|---|
compress |
使用 gzip 压缩旧日志 |
delaycompress |
延迟一轮再压缩 |
nocompress |
不压缩 |
delaycompress 常用于仍可能被进程占用的日志文件。
5. 文件存在与空文件控制
| 参数 | 说明 |
|---|---|
missingok |
日志不存在时不报错 |
notifempty |
空文件不轮转 |
ifempty |
即使为空也轮转 |
6. 日志文件创建
create 0644 root root
表示:
- 权限:0644
- 属主:root
- 属组:root
7. 文件命名与扩展
| 参数 | 说明 |
|---|---|
dateext |
使用日期作为后缀 |
dateformat |
自定义日期格式 |
extension |
指定日志扩展名 |
示例:
dateext
dateformat -%Y%m%d
脚本控制
1. postrotate / prerotate
postrotate
systemctl reload rsyslog
endscript
| 指令 | 说明 |
|---|---|
prerotate |
轮转前执行 |
postrotate |
轮转后执行 |
📌 常用于:
- 重新加载服务
- 通知进程重新打开日志文件
2. sharedscripts
sharedscripts
表示:
- 多个日志文件只执行一次脚本
- 避免重复 reload 服务
logrotate 命令行用法
1. 手动执行 logrotate
logrotate /etc/logrotate.conf
2. 调试模式(非常有用)
logrotate -d /etc/logrotate.conf
只显示执行过程,不真正轮转日志。
3. 强制轮转
logrotate -f /etc/logrotate.conf
无视时间和大小条件,立即轮转。
4. 指定状态文件
logrotate -s /var/lib/logrotate/status
状态文件用于记录每个日志上次轮转时间。
常见问题与解决方案
1. 日志轮转后程序仍写旧文件
原因:
- 程序未重新打开文件描述符
解决:
postrotate
systemctl reload 服务名
endscript
2. 日志不轮转
排查思路:
- 使用
-d查看调试信息 - 检查日志路径是否正确
- 查看状态文件是否被锁定
3. Docker / 自定义服务日志管理
建议:
- 使用独立配置文件
- 明确
size + rotate + compress
总结
logrotate 是 Linux 系统中不可或缺的日志管理工具,它通过灵活的配置机制,实现了日志文件的自动轮转、压缩与清理,有效避免了日志无限增长带来的系统风险。
通过合理配置 logrotate,可以:
- 保证系统稳定运行
- 降低磁盘空间压力
- 提升运维自动化水平