一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 中 nginx.conf 如何实现日志按日期自动分割

时间:2026-09-04 18:56:49 编辑:袖梨 来源:一聚教程网

Nginx 本身不支持日志按日期自动分割,需借助 logrotate 或脚本+cron 实现;核心是定时切割日志文件并发送 USR1 信号通知 Nginx reopen 日志句柄。

Nginx 本身不支持日志按日期自动分割,需借助外部工具(如 logrotate)或通过脚本+重载机制实现。核心思路是:定时切割日志文件 + 通知 Nginx 重新打开日志文件(即 reopen 日志句柄)。

使用 logrotate 管理日志切割(推荐)

logrotate 是 Linux 系统最常用、最稳定的日志轮转工具,配合 Nginx 的 USR1 信号可安全完成按天切割。

  1. 确保 logrotate 已安装(大多数发行版默认自带)
  2. 创建配置文件,例如 /etc/logrotate.d/nginx
/var/log/nginx/*.log {dailymissingokrotate 30compressdelaycompressnotifemptycreate 0644 www-data www-datasharedscriptspostrotateif [ -f /var/run/nginx.pid ]; thenkill -USR1 `cat /var/run/nginx.pid`fiendscript}

说明:

daily 表示每天切割一次;

postrotate 中的 kill -USR1 会通知 Nginx 关闭当前日志文件并用新文件名重新打开(Nginx 收到 USR1 后会 reopen 所有 open 的日志文件);

create 指定新日志权限和属主(需与 Nginx 运行用户一致,如 www-data 或 nginx)。

手动脚本 + cron 定时执行(适合定制化场景)

若无法使用 logrotate,可写简单 shell 脚本,由 crontab 每日凌晨触发:

  1. 新建脚本 /usr/local/bin/nginx-rotate.sh
#!/bin/bashLOG_DIR="/var/log/nginx"DATE=$(date -d "yesterday" +%Y%m%d)mv "$LOG_DIR/access.log" "$LOG_DIR/access.log.$DATE"mv "$LOG_DIR/error.log" "$LOG_DIR/error.log.$DATE"# 通知 Nginx 重新打开日志kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null)
  1. 赋予执行权限:chmod +x /usr/local/bin/nginx-rotate.sh
  2. 添加 cron 任务(如每天 00:00 执行):0 0 * * * /usr/local/bin/nginx-rotate.sh

注意:确保脚本中路径、用户权限、PID 文件位置与实际环境一致;mv 前可加 test -f 判断避免报错。

nginx.conf 中无需特殊配置,但需确认日志路径规范

Nginx 配置本身不参与切割逻辑,但以下两点影响切割效果:

  1. 日志路径应为绝对路径,且不要带变量(如 $time_iso8601),否则 logrotate 或脚本无法稳定匹配
  2. 确保 access_logerror_log 指向明确文件,例如:
access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;

不建议写成 access_log /var/log/nginx/access_$(date).log; —— Nginx 不解析 shell 变量,且无法动态更新文件名。

验证是否生效

切割后检查:

– 查看 /var/log/nginx/ 目录下是否有类似 access.log.20240520 的历史文件;

– 执行 ps aux | grep nginx 确认主进程仍在运行;

– 查看最新 access.log 是否有新请求写入(而非追加到旧文件);

– 检查 Nginx 错误日志中无 “open() failed” 类警告(说明 reopen 成功)。

热门栏目