## 日志为什么要切割
Nginx 自身不会滚动日志文件,access.log 与 error.log 只会越写越大:占用磁盘、排查时打开卡顿,更麻烦的是统计脚本按天取文件时无据可依。logrotate 是发行版自带的日志轮转工具,按天或按大小切割、压缩归档、超期删除,配置一次长期生效。它由系统的每日定时任务驱动,不需要额外的守护进程,切割、压缩、清理的动作都在配置文件里声明清楚。
## 配置模板
Nginx 官方包通常自带 /etc/logrotate.d/nginx,自编译安装则需要自己补一份,模板如下:
/var/log/nginx/*.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
dateext
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
各字段含义:daily 按天切割;rotate 14 保留十四份旧文件;compress 压缩归档,delaycompress 让最近一份先不压缩,方便直接查看;dateext 在文件名后缀加日期,定位直观;missingok 与 notifempty 处理文件不存在或为空的边界情况。关键在 postrotate 里的 USR1 信号:切割是改名动作,Nginx 进程仍握着旧文件句柄继续写入,USR1 通知它按新路径重新打开日志文件,不重启发服务。
## 怎么确认生效
logrotate 由系统的每日定时任务驱动,不想等就手动验证:logrotate -d 配置文件是干跑模式,只输出计划动作不动文件;logrotate -f 配置文件强制立即执行一次。执行后 ls 日志目录,应看到带日期的归档与全新的空日志,向新文件写入一条请求后确认内容在增长,说明句柄已切换。再抽查归档文件解压后内容完整,切割链路就算验证通过。高流量站点按天切割也要估算单日体积,给日志目录单独规划容量,避免与业务数据互相挤占。
## 注意事项
保留份数按日志量定,高流量站点按天切割仍可能单文件几个 G,可以改成按小时或按大小切割。日志也是磁盘杀手,切割之外建议在顺云控制台给磁盘使用率配上告警,归档目录单独规划容量。自编译安装时注意 pid 文件路径与实际一致,路径写错导致信号发不出去,旧句柄不释放,就会出现磁盘占用仍在涨但新文件为空的怪象。