logrotate 安全切割+压缩旧日志+精简新日志内容三者协同,可兼顾数据完整性与体积控制;需配置 sharedscripts、postrotate 发送 USR1 信号,并启用 dateext、compress、delaycompress 等选项。
关键在于“切割时不中断写入”+“压缩旧日志”+“精简新日志内容”,三者配合才能既保数据又减体积。
这是最稳妥的方案,系统级工具成熟稳定,不会丢日志。
kill -USR1 通知 Nginx 重开日志文件,而不是直接 mv 或 cp —— 这样能避免写入间隙%Y%m%d)替代数字序号,便于识别和归档;搭配 rotate 7 可控保留周期/var/log/nginx/*.log {
daily
dateext
rotate 7
compress
delaycompress
missingok
notifempty
create 644 nginx nginx
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
压缩只能减存量,精简格式才是控增量的核心。
log_format,去掉非必要字段:比如 $http_x_forwarded_for、$request_time、$upstream_response_time 若不用于分析,可删减map 指令过滤,只对非静态路径记录 access 日志高流量场景下,不是每条请求都值得全量记录。
if 参数控制日志开关,例如只记录状态码 ≥400 的错误请求:access_log /var/log/nginx/error_only.log main if=$loggable;
再配合 map $status $loggable { ~^[45] 1; default 0; }
map $remote_addr $sampled { default 0; "~^.*$" 1; } # 更实用的是基于 $request_id 或哈希取模(需自定义逻辑)
error_log 级别为 error 或 crit,减少冗余输出上线前务必实测,避免配置失误导致日志静默丢失。
logrotate -d -f /etc/logrotate.d/nginx 先跑 debug 模式,确认路径、权限、信号发送无误• ls -lt /var/log/nginx/ 看新文件是否生成且大小在增长
• tail -f /var/log/nginx/access.log 确认实时写入未中断
• zcat /var/log/nginx/access.log-20260819.gz | head -5 验证压缩内容完整