好的,阿杰 😊 我来给你详细讲一下 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

好嘞,阿杰 👍
下面我给你整理一份 常见服务的 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 100Msize 1G 配合 rotate 控制。