很久之前做nginx日志文件的切割,通过脚本方式完成,最近在配置nginx日志文件切割的时候,发现logrotate方式更古老和优雅,记录下:

创建配置文件

创建/etc/logrotate.d/nginx文件,内容如下:

/usr/local/bin/nginx/logs/*.log {
    daily
    missingok
    rotate 365
    compress
    delaycompress
    notifempty
    create 0640 root root
    sharedscripts
    dateext
    dateformat -%Y%m%d
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 `cat /var/run/nginx.pid`
        fi
    endscript
}

配置说明

  1. /usr/local/bin/nginx/logs/*.log 指定 Nginx 日志文件的路径
  2. daily: 指定日志文件的旋转频率为每日。
  3. missingok: 如果日志文件丢失,不会显示错误信息。
  4. rotate 365: 保留最近 365个旋转日志文件,超过这个数量的旧日志文件将被删除。
  5. compress: 通过 gzip 压缩旋转的日志文件。
  6. delaycompress: 延迟到下一个日志旋转周期才压缩日志文件。这防止在日志旋转和压缩的同一天压缩文件。
  7. notifempty: 如果日志文件为空,则不旋转。
  8. create 0640 nginx adm: 在日志旋转后使用指定的权限创建新的日志文件,并设置所有者为 nginx,组为 adm。
  9. sharedscripts: 如果有多个日志文件匹配模式,postrotate 脚本只会运行一次。
  10. dateext: 使用此选项后,logrotate 会在旋转后的日志文件名中添加日期后缀。
  11. dateformat: 指定日期格式。-%Y%m%d 表示日期格式为 YYYYMMDD。例如,如果切割日期为 2024 年 7 月 1 日,切割后的文件名将包含 -20240701。
  12. postrotate … endscript: 在日志旋转后运行的脚本。在这里,它发送 USR1 信号到 Nginx 主进程以便 Nginx 重新打开日志文件。

测试配置正确性

logrotate -d /etc/logrotate.d/datatrans.nginx

手工进行切割

logrotate -f /etc/logrotate.d/datatrans.nginx