nginx日志如何切割

2026-07-07技术问答104447

Nginx 日志切割(按天/大小等)常见有 三种方式logrotate(推荐)手动脚本 + cronNginx 信号切割。下面按使用频率从高到低说明。


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

1️⃣ 原理

logrotate 是 Linux 自带工具,可按天/大小自动切割、压缩、保留历史日志,并 reload nginx。


2️⃣ 配置示例

创建配置文件

vim /etc/logrotate.d/nginx

内容示例(按天切割)

/var/log/nginx/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    dateext
    dateformat -%Y%m%d
    create 0640 nginx nginx
    sharedscripts
    postrotate
        systemctl reload nginx > /dev/null 2>&1 || true
    endscript
}

3️⃣ 参数说明

参数 说明
daily 每天切割
rotate 30 保留 30 天
compress 启用 gzip
dateext 日志加日期
postrotate 切割后 reload nginx
missingok 日志不存在不报错

4️⃣ 测试是否生效

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

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

原理

  • 重命名日志文件
  • 发送 USR1 信号让 nginx 重新打开日志

示例脚本

#!/bin/bash

LOG_PATH="/var/log/nginx"
DATE=$(date +%Y%m%d)

mv $LOG_PATH/access.log $LOG_PATH/access.log.$DATE
mv $LOG_PATH/error.log $LOG_PATH/error.log.$DATE

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

加入定时任务

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

✅ 适合自定义逻辑强的场景


✅ 方式三:按大小切割(不常用)

logrotate 本身就支持:

size 100M

示例:

/var/log/nginx/*.log {
    size 100M
    rotate 10
    postrotate
        systemctl reload nginx
    endscript
}

✅ 推荐方案总结

场景 推荐方式
生产环境 ✅ logrotate
自定义脚本 Nginx USR1
按大小 logrotate + size

✅ 常见问题

❓ 切割后日志不写新文件?

✅ 一定要 reload / USR1,否则 nginx 仍写旧 fd

❓ 日志名没有日期?

✅ 加:

dateext
dateformat -%Y%m%d

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

  • OS(CentOS / Ubuntu)
  • Nginx 版本
  • 日志路径

我可以帮你生成完全可用的配置

《nginx日志如何切割.doc》

下载本文的Word格式文档,以方便收藏与打印。