温馨提示×

nginx日志怎么切割

小樊
44
2026-08-02 18:28:12
栏目: 编程语言

Nginx 日志切割常见有 三种方式logrotate(推荐)手动脚本 + cronNginx 信号切割。下面按常用程度给你讲清楚,并附示例。


✅ 方式一:使用 logrotate(生产环境最推荐)

原理

logrotate 是 Linux 自带工具,可自动按天/大小切割、压缩、删除旧日志,并 reload nginx。

示例配置

sudo vim /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        systemctl reload nginx > /dev/null 2>&1
    endscript
}

参数说明

参数 含义
daily 每天切割
rotate 30 保留 30 天
compress 压缩旧日志
missingok 日志不存在不报错
notifempty 空日志不切割
postrotate 切割后执行(reload nginx)

测试

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

优点:稳定、自动、无需写脚本
适合:生产环境


✅ 方式二:Nginx 信号切割(官方方式)

原理

nginx 支持通过信号重新打开日志文件。

步骤

mv /var/log/nginx/access.log /var/log/nginx/access.log.2026-01-21
kill -USR1 $(cat /var/run/nginx.pid)

写个脚本

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

mv $LOG_PATH ${LOG_PATH}.$DATE
kill -USR1 $(cat /var/run/nginx.pid)

加入定时任务

crontab -e
0 0 * * * /usr/local/bin/nginx_log_cut.sh

优点:官方支持
缺点:需自己处理压缩、清理


✅ 方式三:手动脚本(不推荐)

不细讲,主要问题是:

  • 要自己处理 pid
  • 容易漏 reload
  • 不如 logrotate 稳定

✅ 推荐方案总结

场景 推荐方式
生产环境 ✅ logrotate
临时/简单 nginx USR1
学习/测试 任意

✅ 常见坑提醒

  1. 一定要 reload nginx
    • 否则 nginx 仍写旧文件
  2. 权限问题
    • nginx 用户要能写日志目录
  3. docker 环境
    • 建议挂载日志目录,用宿主机 logrotate

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

  • ✅ 系统(CentOS / Ubuntu / Docker)
  • ✅ nginx 安装方式(源码 / apt / yum)

我可以给你 完全贴合你环境的配置

0