nginx日志动态切分需依赖外部工具,主流方案是logrotate配合nginx -s reopen实现零停机轮转;按小时/分钟切分需脚本定时重命名+reopen;syslog方式可解耦但引入额外依赖。

实现 Nginx 日志的动态切分,核心不是靠 Nginx 自身(它不支持按时间自动轮转),而是通过外部工具配合 logrotate 或自定义脚本,在日志写入过程中触发切割与归档。关键在于避免重启或重载 Nginx 时丢失请求日志,并确保新日志文件被正确接管。
使用 logrotate 配合 nginx -s reopen 实现安全轮转
logrotate 是最常用、最稳妥的方案。它通过发送 USR1 信号(等价于 nginx -s reopen)通知 Nginx 关闭旧日志文件句柄、打开新文件,整个过程不中断服务、不丢日志。
- 配置
/etc/logrotate.d/nginx:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 www-data www-data
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
-
sharedscripts确保所有匹配日志共用一次postrotate; -
create指定新日志权限和属主,必须与 Nginx 工作进程一致(如用www-data运行); - 确保 Nginx 启动时使用了
pid文件路径(在nginx.conf中配置pid /var/run/nginx.pid;)。
按小时/分钟切分:需自定义日志文件名 + 定时触发 reopen
logrotate 默认只支持 daily/weekly/monthly,若需按小时(如 access.log.20240520-14)或分钟切分,需改用脚本控制日志路径 + 定时调用 nginx -s reopen。
- 在
nginx.conf中用$time_iso8601或$date_gmt动态生成文件名(注意:仅限 1.7.9+,且需开启open_log_file_cache off;):
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
<h1>⚠️ 不推荐直接用于高频轮转:性能开销大、缓存失效频繁</h1><p>access<em>log /var/log/nginx/access</em>$(date -d "yesterday" +\%Y\%m\%d).log main;</p>- 更实用做法:固定日志路径(如
/var/log/nginx/access.log),由外部脚本定时重命名 + 发送 reopen; - 例如每小时执行:
mv /var/log/nginx/access.log /var/log/nginx/access_$(date -d '1 hour ago' +\%Y\%m\%d-\%H).log && nginx -s reopen; - 务必确保 mv 和 reopen 原子执行,避免中间时段日志写入丢失。
零停机前提下的注意事项
动态切分成败取决于是否真正“零感知”。以下三点极易出错:
- 权限一致性:新日志文件创建时,属主/属组/权限必须与原文件完全相同,否则 Nginx 工作进程无法写入;
-
信号时机:不要在 logrotate 的
prerotate中删旧日志,应在postrotate发送 USR1 后再处理压缩/清理; -
多 worker 场景:Nginx 多 worker 共享同一日志文件,
reopen会令所有 worker 同时切换,无需额外同步。
替代方案:syslog 方式集中收集与切分
将 Nginx 日志输出到 syslog(如 access_log syslog:server=127.0.0.1:514,facility=local7,tag=nginx;),再由 rsyslog 或 syslog-ng 接收并按规则切分归档。适合大规模集群或已有日志平台(如 ELK)的场景。
- 优势:解耦 Nginx 与存储逻辑,支持过滤、转发、加密;
- 代价:增加单点依赖、网络延迟、需要额外维护 syslog 服务;
- 注意设置
buffering和reconnect参数,防止 syslog 不可用时丢日志。











