Nginx日志需按时间轮转、自动压缩、定期清理三者结合;用logrotate配置weekly轮转、rotate 5、compress及postrotate nginx -s reopen;手动补救可gzip老日志并rm原文件;精简log_format和跳过静态资源可减量30%~60%;find定时清理90天前.gz日志。

nginx日志长期不处理会迅速占满磁盘,尤其在高并发或调试阶段。核心思路是:按时间轮转 + 自动压缩 + 定期清理,三者缺一不可。
启用logrotate自动轮转
Linux系统自带的logrotate是最稳定、低侵入的方案。编辑配置文件(如/etc/logrotate.d/nginx):
- 指定日志路径:/var/log/nginx/*.log
- 设置每周轮转:weekly(也可用daily或size 100M)
- 保留最近5份:rotate 5
- 旧日志立即压缩:compress(默认用gzip)
- 轮转后通知nginx重开日志文件:create 644 www-data www-data + sharedscripts + postrotate ... nginx -s reopen ... endscript
手动压缩历史日志(临时补救)
若磁盘已告急,可快速压缩未被logrotate接管的老日志:
- 进入日志目录:cd /var/log/nginx
- 压缩所有.log文件(保留原文件名,加.gz后缀):gzip *.log
- 若想删除原始未压缩日志(确认已压缩成功):rm *.log
- 注意:不要压缩正在写入的access.log或error.log,应先用nginx -s reopen切到新文件再操作
精简日志内容降低体积
不是所有字段都必要。在nginx.conf中调整log_format:
- 去掉低价值字段,例如$http_user_agent(除非做终端分析)、$http_referer(除非追踪来源)
- 避免记录静态资源(js/css/png等),用location块跳过日志:access_log off;
- 调试时开启详细日志,上线后切回精简格式,可减少30%~60%日志量
设置定时清理超期压缩包
logrotate虽压缩,但压缩包仍长期留存。可用find命令定期清理:
- 每月删除90天前的.gz日志:find /var/log/nginx -name "*.log.gz" -mtime +90 -delete
- 加入crontab(如每月1号凌晨2点执行):0 2 1 * * find /var/log/nginx -name "*.log.gz" -mtime +90 -delete
- 建议先用-print测试匹配是否正确,再加-delete
不复杂但容易忽略:轮转配置改完要手动运行logrotate -f /etc/logrotate.d/nginx验证一次,确保无语法错误且能正常切日志。

















