Linux logrotate 命令详解
logrotate 是 Linux 系统中用于自动管理日志文件轮转、压缩、删除和归档的工具,防止日志文件无限增长占满磁盘空间。
一、核心概念
1. 工作原理
- 定期执行:通过 cron 定时任务(通常每天执行一次)
- 配置驱动:读取配置文件决定如何处理日志
- 状态记录:记录上次轮转时间到状态文件
2. 典型应用场景
- Web 服务器日志(Nginx/Apache)
- 应用日志(Java/Python 应用)
- 系统日志(syslog/rsyslog)
- 数据库日志(MySQL/PostgreSQL)
二、配置文件结构
1. 主配置文件
1 2 3
| /etc/logrotate.conf /etc/logrotate.d/ /var/lib/logrotate/status
|
2. 配置文件示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| /var/log/nginx/*.log { daily rotate 7 missingok notifempty compress delaycompress sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript }
|
三、核心配置参数详解
1. 轮转频率
1 2 3 4 5
| daily weekly monthly yearly size 100M
|
2. 保留策略
1 2 3 4
| rotate 7 maxage 30 minsize 100k maxsize 500M
|
3. 压缩选项
1 2 3 4 5 6
| compress nocompress delaycompress compresscmd /usr/bin/bzip2 compressext .bz2 compressoptions "-9"
|
4. 文件命名
1 2 3 4 5
| dateext dateformat -%Y%m%d extension .log olddir /var/log/old noolddir
|
5. 权限控制
1 2 3 4
| create 0644 nginx nginx nocreate copytruncate nocopytruncate
|
6. 错误处理
1 2 3 4 5 6
| missingok nomissingok notifempty ifempty sharedscripts nosharedscripts
|
7. 执行脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| prerotate /usr/bin/chattr -a /var/log/messages endscript
postrotate /usr/bin/killall -HUP syslogd endscript
firstaction endscript
lastaction endscript
|
四、实战案例
案例 1:Nginx 访问日志配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| /var/log/nginx/access.log { daily rotate 14 missingok notifempty compress delaycompress dateext dateformat -%Y%m%d create 0640 nginx adm sharedscripts postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript }
|
效果:
- 每天轮转,保留 14 天
- 旧日志命名如:
access.log-20240115
- 压缩后变成:
access.log-20240114.gz
案例 2:应用日志按大小轮转
1 2 3 4 5 6 7 8 9
| /opt/myapp/logs/*.log { size 500M rotate 5 copytruncate compress notifempty missingok }
|
适用场景:应用持续写入日志文件,无法优雅重启
案例 3:MySQL 慢查询日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| /var/log/mysql/slow.log { weekly rotate 52 missingok notifempty compress delaycompress create 0640 mysql mysql postrotate /usr/bin/mysqladmin -u root -p'password' flush-logs endscript }
|
案例 4:多路径日志统一管理
1 2 3 4 5 6 7 8 9 10
| /var/log/app1/*.log /var/log/app2/*.log { daily rotate 30 compress sharedscripts postrotate systemctl reload app-cluster endscript }
|
五、命令行操作
1. 手动执行轮转
1 2 3 4 5 6 7 8 9 10 11
| logrotate -d /etc/logrotate.conf
logrotate -f /etc/logrotate.conf
logrotate -v /etc/logrotate.conf
logrotate -s /var/lib/logrotate/custom.status /etc/logrotate.d/nginx
|
2. 验证配置语法
1
| logrotate -d /etc/logrotate.d/nginx
|
六、常见问题排查
问题 1:日志未自动轮转
排查步骤:
1 2 3 4 5 6 7 8 9 10 11
| cat /etc/cron.daily/logrotate
cat /var/lib/logrotate/status
logrotate -d -f /etc/logrotate.d/nginx
ls -la /var/log/nginx/
|
常见原因:
- 状态文件权限问题
- 日志文件被其他进程占用
- 配置语法错误
问题 2:轮转后应用无法写入日志
原因:应用仍持有旧文件句柄
解决方案:
1 2 3 4 5 6 7 8 9
| copytruncate
postrotate systemctl reload nginx endscript
|
问题 3:压缩文件占用大量 CPU
优化策略:
1 2 3 4 5 6 7 8
| compressoptions "-1"
delaycompress
nice -n 19 logrotate /etc/logrotate.conf
|
七、高级技巧
1. 按小时轮转
需结合 cron 实现:
1 2 3
|
/usr/sbin/logrotate /etc/logrotate.d/hourly-app
|
配置文件:
1 2 3 4 5
| /var/log/app/access.log { hourly rotate 24 dateformat -%Y%m%d-%H }
|
2. 邮件通知
1 2 3 4 5 6
| /var/log/critical.log { daily rotate 7 mail admin@example.com mailfirst }
|
3. 远程备份
1 2 3
| postrotate rsync -az /var/log/nginx/*.gz backup@remote:/backup/ endscript
|
八、性能优化建议
- 避免在高峰期执行:调整 cron 时间到凌晨 3-4 点
- 分散轮转时间:不同应用配置在不同时间段
- **使用
delaycompress**:减少 I/O 压力
- 定期清理旧日志:结合
maxage 或独立脚本
九、安全注意事项
- 配置文件权限:
1 2
| chmod 644 /etc/logrotate.d/* chown root:root /etc/logrotate.d/*
|
- 避免脚本注入:
1 2 3 4
| postrotate eval $CUSTOM_COMMAND endscript
|
- 日志敏感信息处理:
1 2 3 4
| postrotate sed -i 's/password=[^&]*/password=***/g' /var/log/app/*.log.1 endscript
|
总结
| 维度 |
关键点 |
| 核心功能 |
自动轮转、压缩、删除、归档 |
| 执行方式 |
Cron 定时任务 + 配置文件驱动 |
| 重点参数 |
rotate、compress、postrotate、copytruncate |
| 调试命令 |
logrotate -d -v |
| 常见陷阱 |
文件句柄未释放、权限错误、时间判断失效 |
最佳实践:
- 优先使用应用自带日志轮转(如 Nginx 的
reopen 信号)
- 测试环境验证配置后再上线
- 监控磁盘空间和轮转执行状态
- 定期审查日志保留策略是否符合合规要求
完~