温馨提示×

如何切割nginx日志

小樊
38
2026-07-18 23:54:06
栏目: 编程语言

切割(rotate)Nginx 日志通常有三种常见方式:Nginx 自带信号方式logrotate自定义脚本。下面按推荐程度给你详细说明。


✅ 推荐方式一:logrotate(最常用,生产首选)

大多数 Linux 发行版已经自带 logrotate,非常适合自动切割、压缩、删除旧日志。

1️⃣ 示例配置

创建 /etc/logrotate.d/nginx

/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 www-data www-data
    sharedscripts
    postrotate
        nginx -s reopen
    endscript
}

2️⃣ 参数说明

参数 含义
daily 每天切割
rotate 30 保留 30 天
compress 压缩旧日志
notifempty 空文件不切割
create 新日志文件权限
nginx -s reopen 通知 Nginx 重新打开日志文件

3️⃣ 测试是否生效

logrotate -d /etc/logrotate.d/nginx   # 调试
logrotate -f /etc/logrotate.d/nginx   # 强制执行

优点

  • 自动化
  • 稳定
  • 生产环境最安全

✅ 方式二:用 Nginx 信号手动切割(简单但不够自动)

1️⃣ 手动切割流程

mv /var/log/nginx/access.log /var/log/nginx/access.log.2026-01-21
nginx -s reopen

或者:

nginx -s reopen

2️⃣ 常见脚本示例

#!/bin/bash
LOG_PATH="/var/log/nginx/access.log"
DATE=$(date +%F)

mv $LOG_PATH ${LOG_PATH}.$DATE
nginx -s reopen

然后加入 crontab:

0 0 * * * /usr/local/bin/cut_nginx_log.sh

⚠️ 缺点

  • 需要自己处理压缩、清理
  • 不如 logrotate 完善

✅ 方式三:使用 USR1 信号(原理说明)

Nginx 的日志切割本质是:

重命名日志文件 + 发送 USR1 信号

kill -USR1 $(cat /var/run/nginx.pid)

nginx -s reopen 本质就是发送 USR1


✅ 常见坑位提醒

❌ 切割后日志不写入新文件

原因:

  • 没执行 nginx -s reopen
  • 权限不对

❌ Docker 中日志不生效

  • 日志路径是 volume
  • 宿主机 logrotate 无法 reopen

✅ 解决:

  • access.log → stdout
  • 或宿主机 reopen

✅ 总结建议

场景 推荐方式
生产环境 ✅ logrotate
临时/测试 nginx -s reopen
特殊定制 自定义脚本

如果你愿意,我可以:

  • ✅ 按 CentOS / Ubuntu / Docker 给你定制配置
  • ✅ 帮你排查 当前日志不切割的原因
  • ✅ 写一套 自动清理 + 切割脚本

直接告诉我你的环境即可。

0