Logrotate 日志轮转配置教程
Logrotate 是 Linux 系统中用于自动轮转、压缩和清理日志文件的工具。如果不及时处理,日志文件会不断增长直到耗尽磁盘空间。在搬瓦工 VPS 上,尤其是磁盘空间有限的方案中,合理配置 Logrotate 非常重要。本教程将详细讲解 Logrotate 的配置方法和实际应用。
一、Logrotate 工作原理
Logrotate 由系统的 cron 定时任务每天调用一次,读取配置文件中定义的规则,对符合条件的日志执行轮转操作。轮转过程包括重命名当前日志、创建新的空日志文件、压缩旧日志、删除过期的日志文件。
# 查看 Logrotate 的 cron 任务
cat /etc/cron.daily/logrotate
# 查看 Logrotate 版本
logrotate --version
二、配置文件结构
Logrotate 的主配置文件为 /etc/logrotate.conf,各应用的独立配置文件存放在 /etc/logrotate.d/ 目录中。
2.1 主配置文件
# /etc/logrotate.conf
# 全局默认设置
# 每周轮转一次
weekly
# 保留 4 个归档文件
rotate 4
# 轮转后创建新的日志文件
create
# 使用日期作为轮转文件后缀
dateext
# 压缩旧日志
compress
# 包含应用专属配置
include /etc/logrotate.d
2.2 常用配置指令
/var/log/myapp/*.log {
# 轮转频率
daily # 每天轮转
# weekly # 每周轮转
# monthly # 每月轮转
# 保留数量
rotate 14 # 保留 14 个归档
# 压缩选项
compress # 压缩归档日志
delaycompress # 延迟一个周期再压缩
compresscmd /usr/bin/xz # 使用 xz 压缩
compressext .xz # 压缩文件扩展名
# 文件处理
missingok # 日志文件不存在也不报错
notifempty # 空文件不轮转
create 0640 root adm # 创建新日志(权限 属主 属组)
copytruncate # 复制后截断(适合不支持重载的应用)
# 大小限制
size 100M # 达到 100MB 时轮转
minsize 50M # 至少达到 50MB 才轮转
maxsize 500M # 超过 500MB 时强制轮转
# 日期格式
dateext # 使用日期后缀
dateformat -%Y%m%d # 日期格式
}
三、实际配置示例
3.1 Nginx 日志轮转
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
dateext
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
3.2 MySQL 慢查询日志
# /etc/logrotate.d/mysql-slow
/var/log/mysql/slow-query.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
create 0640 mysql adm
sharedscripts
postrotate
if [ -f /var/run/mysqld/mysqld.pid ]; then
kill -HUP $(cat /var/run/mysqld/mysqld.pid)
fi
endscript
}
3.3 自定义应用日志
# /etc/logrotate.d/myapp
/var/log/myapp/app.log
/var/log/myapp/error.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
copytruncate
size 50M
dateext
dateformat -%Y%m%d-%H%M%S
}
# Docker 容器日志
/var/lib/docker/containers/*/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
size 100M
}
3.4 按大小轮转
# /etc/logrotate.d/large-logs
/var/log/large-app/*.log {
size 200M
rotate 5
compress
missingok
notifempty
copytruncate
postrotate
echo "日志已轮转: $(date)" >> /var/log/logrotate-notify.log
endscript
}
四、脚本钩子
Logrotate 支持在轮转前后执行自定义脚本:
/var/log/myapp/*.log {
daily
rotate 7
compress
# 轮转前执行
prerotate
echo "开始轮转: $(date)" >> /var/log/logrotate-audit.log
endscript
# 轮转后执行
postrotate
systemctl reload myapp 2>/dev/null || true
endscript
# 首次轮转后执行(所有文件轮转完毕后只执行一次)
lastaction
# 发送通知
echo "所有日志轮转完成" | mail -s "Logrotate 完成" admin@example.com
endscript
}
五、测试与调试
# 模拟运行(不实际执行)
logrotate -d /etc/logrotate.d/nginx
# 强制立即执行轮转
logrotate -f /etc/logrotate.d/nginx
# 详细输出
logrotate -v /etc/logrotate.conf
# 同时使用详细和调试模式
logrotate -dv /etc/logrotate.d/myapp
# 查看轮转状态记录
cat /var/lib/logrotate/status
六、常见问题与解决
6.1 日志文件不轮转
# 检查配置文件语法
logrotate -d /etc/logrotate.d/myapp
# 检查状态文件中的时间戳
grep "myapp" /var/lib/logrotate/status
# 强制重置状态
echo '"/var/log/myapp/app.log" 2020-1-1' > /var/lib/logrotate/status
6.2 磁盘空间已满
# 紧急清理日志
truncate -s 0 /var/log/syslog
truncate -s 0 /var/log/kern.log
# 删除旧的压缩日志
find /var/log -name "*.gz" -mtime +7 -delete
# 查看日志目录大小
du -sh /var/log/
du -sh /var/log/* | sort -rh | head -10
6.3 权限问题
# 确保 Logrotate 有权限操作日志文件
ls -la /var/log/myapp/
# 修复权限
chown root:adm /var/log/myapp/
chmod 755 /var/log/myapp/
七、最佳实践
- 磁盘有限时使用 size 指令:搬瓦工 VPS 磁盘空间通常有限,使用
size指令按大小轮转比按时间更安全。 - 始终启用 compress:压缩可以节省 80% 以上的磁盘空间。
- 使用 delaycompress:延迟压缩可以方便查看最近一次轮转的日志。
- 合理设置 rotate 数量:根据磁盘空间和日志重要性设置保留数量。
- Docker 日志控制:Docker 容器日志也需要轮转,或者在
daemon.json中限制日志大小。
总结
Logrotate 是防止日志撑满磁盘的关键工具。在搬瓦工 VPS 上正确配置 Logrotate,可以确保日志系统长期稳定运行。建议搭配 Rsyslog 日志管理 和 Journalctl 日志查看 教程一起学习,全面掌握 Linux 日志管理。选购搬瓦工 VPS 请查看全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 循环折扣。