好的,阿杰 😊 我来给你详细讲一下 Linux 自带神器 logrotate 的原理、用法和实战案例。
🔥 Linux 自带神器 logrotate 详解
1. logrotate 是什么?
- logrotate 是 Linux 系统自带的日志管理工具,用于 自动轮转(rotate)、压缩(compress)、删除(remove)、以及邮件发送(mail) 系统或应用的日志文件。
- 主要解决日志文件不断增长导致:
- 占用大量磁盘空间
- 查看日志困难
- 管理混乱
📌 核心思想:
与其让日志文件无限增长,不如定期切分成 旧日志 和 新日志,并可压缩旧日志,节省空间。
2. logrotate 的配置文件位置
默认配置文件及目录:
- 主配置文件:
/etc/logrotate.conf
- 扩展配置文件目录:
/etc/logrotate.d/
👉 logrotate.conf
是全局配置,
👉 logrotate.d/
里是按应用(如 nginx、syslog、mysql 等)存放的配置文件。
3. logrotate 配置语法
基本格式:
/path/to/log/file {
daily # 日志轮转周期:daily/weekly/monthly/yearly
rotate 7 # 保留的日志文件个数
compress # 启用压缩(gzip)
delaycompress # 延迟一轮再压缩(配合 compress 使用)
missingok # 忽略不存在的日志文件
notifempty # 如果日志为空则不轮转
create 0640 root root # 轮转后新日志文件的权限和属主
sharedscripts # 多个日志文件共用一个脚本
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}
4. 常见指令详解
指令 | 说明 |
---|---|
daily | 每天轮转一次 |
weekly | 每周轮转一次 |
monthly | 每月轮转一次 |
yearly | 每年轮转一次 |
rotate N | 保留 N 个归档日志(超过则删除) |
compress | 压缩旧日志(默认 gzip) |
delaycompress | 延迟一轮后再压缩 |
missingok | 忽略不存在的日志,不报错 |
notifempty | 日志为空时不轮转 |
create mode owner group | 新日志文件的权限、用户、组 |
dateext | 文件名加日期后缀(如 log-20250918.gz) |
postrotate/endscript | 日志轮转后执行的脚本(常用于服务 reload) |
5. 实战案例
示例 1:Nginx 日志管理
/var/log/nginx/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl reload nginx > /dev/null 2>&1 || true
endscript
}
👉 每天轮转一次,保留 14 天,旧日志压缩,轮转后执行 nginx reload
。
示例 2:应用自定义日志
/home/app/logs/app.log {
weekly
rotate 4
compress
notifempty
create 0644 appuser appgroup
postrotate
kill -USR1 `cat /home/app/run/app.pid`
endscript
}
👉 每周轮转,保留 4 周,旧日志 gzip 压缩,轮转后通过发送信号让应用重新生成日志文件。
6. 手动测试与调试
- 测试配置是否正确
logrotate -d /etc/logrotate.conf
(只测试,不执行) - 强制执行一次轮转
logrotate -f /etc/logrotate.conf
7. logrotate 的运行机制
- logrotate 本身不会常驻进程,而是由 cron 定时任务触发:
/etc/cron.daily/logrotate
- 系统每天运行一次
logrotate
,根据配置决定是否轮转。
8. 总结
- logrotate 优点:
- 自动化日志切割与压缩
- 节省磁盘空间
- 便于管理和归档
- 最佳实践:
- 核心服务(nginx/mysql/syslog)用单独配置文件放在
/etc/logrotate.d/
- 应用日志合理设定周期(如 Web 服务用 daily,业务日志用 weekly)
- 配合
postrotate
确保服务 reload
- 核心服务(nginx/mysql/syslog)用单独配置文件放在
好嘞,阿杰 👍
下面我给你整理一份 常见服务的 logrotate 配置模板合集,直接放到 /etc/logrotate.d/
下就能用。
📦 常见服务 logrotate 配置模板合集
1. Nginx 日志
/etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天轮转
rotate 14 # 保留 14 个归档
compress # 压缩旧日志
delaycompress # 延迟一轮再压缩
missingok # 忽略缺失文件
notifempty # 空日志不轮转
create 0640 www-data adm
sharedscripts
postrotate
[ -f /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}
2. MySQL 日志
/etc/logrotate.d/mysql
/var/log/mysql/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 mysql adm
postrotate
test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin flush-logs >/dev/null 2>&1 || true
endscript
}
3. Tomcat 日志
/etc/logrotate.d/tomcat
/opt/tomcat/logs/catalina.out {
size 100M # 日志超过 100M 才轮转
rotate 10
copytruncate # 不重启服务,直接复制并清空原日志
compress
missingok
notifempty
create 0644 tomcat tomcat
}
4. 系统日志(messages/secure/boot)
(大多数 Linux 已默认配置好 /etc/logrotate.d/syslog
,这里是常见样例)
/var/log/messages
/var/log/secure
/var/log/boot.log {
weekly
rotate 4
compress
missingok
notifempty
create 0600 root root
}
5. 应用自定义日志
例如 /home/app/logs/app.log
/home/app/logs/*.log {
weekly
rotate 8
compress
notifempty
missingok
create 0640 appuser appgroup
postrotate
kill -USR1 `cat /home/app/run/app.pid 2>/dev/null` || true
endscript
}
6. 通用模版(可复制改路径)
/path/to/your/log/*.log {
daily|weekly|monthly
rotate N
compress
delaycompress
missingok
notifempty
create 0640 user group
postrotate
# reload command
endscript
}
⚡ 小技巧:
- 如果日志写得很频繁(例如 Java
catalina.out
),推荐copytruncate
,这样不需要重启服务。 - 如果应用支持 信号触发日志切割(如 nginx、mysql),推荐用
postrotate
+ 信号方式,更安全。 - 大日志文件建议
size 100M
或size 1G
配合rotate
控制。
发表回复