温馨提示×

Nginx日志如何按天分割

小樊
44
2026-08-24 05:19:53
栏目: 编程语言

在 Nginx 中,按天分割日志通常有两种主流做法:
使用 logrotate(推荐)
使用定时脚本 + nginx reload

下面分别说明,并给出可直接用的配置示例。


✅ 方式一:使用 logrotate(最常用、最稳妥)

1️⃣ 安装 logrotate(一般系统自带)

which logrotate

2️⃣ 创建 Nginx 日志切割配置

vim /etc/logrotate.d/nginx

3️⃣ 示例配置(按天切割)

/var/log/nginx/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    dateext
    dateformat -%Y%m%d
    create 0640 www-data www-data
    sharedscripts
    postrotate
        [ -s /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
    endscript
}

4️⃣ 参数说明

参数 说明
daily 每天切割
rotate 30 保留 30 天
dateext 使用日期后缀
-%Y%m%d access.log-20260121
kill -USR1 通知 Nginx 重新打开日志文件
compress 压缩旧日志

5️⃣ 测试是否生效

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

优点

  • 系统级方案
  • 自动压缩、自动清理
  • 生产环境首选

✅ 方式二:使用脚本 + crontab

适合自定义需求或容器环境。

1️⃣ 创建脚本

vim /usr/local/bin/nginx_log_split.sh
#!/bin/bash

LOG_PATH="/var/log/nginx"
DATE=$(date -d "yesterday" +"%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 /run/nginx.pid)

2️⃣ 赋予执行权限

chmod +x /usr/local/bin/nginx_log_split.sh

3️⃣ 加入定时任务

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

✅ 每天 0 点执行


✅ 方式三:Nginx 原生方式(不推荐)

Nginx 本身不支持按天自动切日志,只能通过:

  • access_log 指定文件名
  • 配合 reload 或 reopen

所以不能单独靠 Nginx 完成按天切割


✅ 推荐方案总结

场景 推荐方式
生产服务器 ✅ logrotate
Docker / 自定义 脚本 + crontab
简单测试 脚本

✅ 常见问题

❓ 为什么要用 kill -USR1

让 Nginx 重新打开日志文件,否则会继续写旧文件。

❓ 切割后日志还在写旧文件?

  • 没执行 USR1
  • pid 文件路径错误

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

  • ✅ 系统(CentOS / Ubuntu / Docker)
  • ✅ Nginx 版本
  • ✅ 日志路径

我可以帮你定制一套完全可用的配置

0