好的,阿杰 😊 我来给你详细讲一下 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控制。 
发表回复