温馨提示×

linux下如何切割nginx日志

小樊
42
2026-09-08 15:05:28
栏目: 智能运维

在 Linux 下切割 Nginx 日志常见有几种方式,最常用的是 logrotate手动脚本 + nginx 信号。下面按推荐程度说明。


一、推荐方式:使用 logrotate(最规范)

Nginx 安装后,系统通常已经自带了 logrotate 配置。

1. 查看已有配置

cat /etc/logrotate.d/nginx

典型内容:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 nginx nginx
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

2. 手动测试切割

logrotate -d /etc/logrotate.d/nginx   # 模拟
logrotate -f /etc/logrotate.d/nginx  # 强制执行

3. 常用参数说明

  • daily / weekly:切割周期
  • rotate 14:保留 14 份
  • compress:压缩旧日志
  • notifempty:空日志不切
  • postrotate:通知 Nginx 重新打开日志(关键)

优点:自动、系统级、无需自己写脚本


二、手动切割(适合脚本或定时任务)

1. 移动旧日志

mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%Y%m%d)

2. 通知 Nginx 重新生成日志

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

或:

nginx -s reopen

3. 加入 crontab(每天 0 点)

0 0 * * * /bin/mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +\%Y\%m\%d) && kill -USR1 $(cat /var/run/nginx.pid)

⚠️ 注意:% 在 crontab 中需要转义


三、按大小切割(不常见但可用)

Nginx 本身不支持按大小切割日志,必须靠外部工具:

  • logrotatesize 100M
  • 或自己写脚本判断文件大小

示例:

/var/log/nginx/*.log {
    size 100M
    rotate 10
    compress
    postrotate
        kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

四、常见坑

  1. 不通知 Nginx
    • 日志切了但 Nginx 还在写旧文件
  2. 权限问题
    • 日志属主必须是 nginxwww-data
  3. SELinux
    • 可能需要 restorecon -R /var/log/nginx

总结建议

场景 推荐方式
生产环境 ✅ logrotate
临时调试 手动 mv + USR1
容器环境 外部日志收集(如 filebeat)

如果你愿意,可以告诉我:

  • 你的 Nginx 安装方式(源码 / apt / yum)
  • 日志路径
  • 是否容器环境

我可以给你一份可直接用的配置

0