核心是精简日志字段、关闭静态资源日志、启用缓冲写入与logrotate轮转:只保留$remote_addr、$request、$status等必要字段,匹配后缀关闭js/css/png等静态日志,配置buffer=64k flush=5s,并每日轮转压缩保留7天。

核心是只保留真正需要的字段,去掉体积大、价值低的内容。日志体积下降30%~60%很常见,关键是按需裁剪,而不是套用通用格式。
精简 log_format 字段
默认的 combined 或 main 格式常包含 $http_user_agent、$http_referer、$http_x_forwarded_for 等字段,它们单条可占 200~1000 字节,但多数场景下并不用于分析。
- 基础可用格式(推荐上线使用):
log_format minimal '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent'; - 如需追踪来源且确认必要,才加 $http_referer;如需终端分布分析,再加 $http_user_agent
- 彻底去掉 $request_time、$upstream_response_time、$http_x_forwarded_for —— 它们对常规访问审计无直接作用,却显著增大日志
跳过静态资源日志
JS、CSS、PNG、SVG、woff2 等静态文件请求量大、内容重复、价值极低,单独屏蔽可立减 20%+ 日志量。
- 在 server 或 http 块中添加 location 匹配:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf|eot)$ {
access_log off;
} - 注意匹配顺序:放在通用 location / {} 之前,否则不生效
- 若使用 CDN,更应关闭源站静态资源日志
启用缓冲与延迟刷盘
避免每条日志都触发一次磁盘写入,用内存缓冲批量落盘,既降 I/O 压力,也减少小文件碎片。
- 在 access_log 指令中加入 buffer 和 flush 参数:
access_log /var/log/nginx/access.log minimal buffer=64k flush=5s; - buffer=64k 表示累积满 64KB 再写入;flush=5s 表示最多等 5 秒强制刷盘
- 缓冲区不宜过大(超过 128k 可能增加宕机丢志风险),5~30 秒是较稳妥的 flush 间隔
配合 logrotate 做归档压缩
即使单条日志变小,长期积累仍会占空间。logrotate 是必须启用的配套机制。
- 确保 /etc/logrotate.d/nginx 存在并启用 compress:
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 nginx nginx
} - delaycompress 可让刚轮转的当天日志保持明文,方便紧急排查
- rotate 7 + daily 组合,兼顾可追溯性与磁盘安全











