Nginx日志规范化管理核心是“切得准、存得省、查得快、删得稳”,通过定时切割+USR1重开、logrotate纳管、冷热分层归档、命名规范与目录隔离实现闭环策略。

规范化管理 Nginx 海量日志,核心是“切得准、存得省、查得快、删得稳”,不依赖重启、不丢日志、不占冗余空间。关键不在切割动作本身,而在整套策略闭环:定时切割 → 压缩归档 → 分级保留 → 安全清理。
按天切割 + USR1 信号重开(零丢失基础)
这是最稳妥的切割方式,利用 Linux 文件描述符机制,确保重命名后旧日志仍可写入,直到 Nginx 收到 USR1 信号才切换到新文件。
- 脚本中先用 mv 重命名 access.log 为 access_20260905.log(含日期更易识别)
- 再执行 kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid),让主进程读取配置、新建日志文件
- 务必确认 nginx.pid 路径与实际一致;若用 systemd 管理,可用 nginx -s reload 替代,但 reload 会重载全部配置,USR1 更轻量精准
用 logrotate 统一纳管(推荐生产环境)
比自定义脚本更健壮,支持压缩、保留策略、异常容错,且与系统 cron 深度集成。
- 在 /etc/logrotate.d/nginx 中配置:
- /var/log/nginx/*.log {
- daily
- rotate 30
- compress
- delaycompress
- missingok
- notifempty
- create 0644 www-data adm
- sharedscripts
- postrotate
- [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
- endscript
- }
- 其中 delaycompress 避免刚切完就压缩,留出排查窗口;sharedscripts + postrotate 保证只发一次信号,多日志文件也安全
冷热分层 + 自动归档(降本关键)
不是所有日志都要留在线上。高频访问的近7天保留明文,30天内压缩存档,超90天可转对象存储或离线介质。
- 切割后立即用 gzip 压缩昨日日志:
gzip /var/log/nginx/access_$(date -d "yesterday" +%Y%m%d).log - 用 find 清理过期压缩包:
find /var/log/nginx -name "access_*.log.gz" -mtime +90 -delete - 如需长期合规留存,可加 cron 每日凌晨同步到 OSS/S3:
aws s3 cp /var/log/nginx/access_*.log.gz s3://my-bucket/nginx-logs/ --exclude "*" --include "access_$(date -d "2 days ago" +%Y%m%d)*"
命名规范 + 目录隔离(增效前提)
混乱的文件名和混存路径会让后续分析和自动化失效。
- 统一格式:access_YYYYMMDD_HH.log(小时级可选)、error_YYYYMMDD.log,避免空格和特殊字符
- 按虚拟主机分离目录:
/var/log/nginx/www.example.com/access.log、/var/log/nginx/api.example.com/access.log,便于按业务定位 - Nginx 配置中显式指定路径,不要共用同一 access.log,否则无法单独切割











