一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中日志切割如何在保证数据不丢失的前提下缩减日志体积

时间:2026-08-27 11:43:48 编辑:袖梨 来源:一聚教程网

logrotate 安全切割+压缩旧日志+精简新日志内容三者协同,可兼顾数据完整性与体积控制;需配置 sharedscripts、postrotate 发送 USR1 信号,并启用 dateext、compress、delaycompress 等选项。

关键在于“切割时不中断写入”+“压缩旧日志”+“精简新日志内容”,三者配合才能既保数据又减体积。

用 logrotate 安全切割并自动压缩

这是最稳妥的方案,系统级工具成熟稳定,不会丢日志。

  1. 确保配置中包含 sharedscriptspostrotate 段,用 kill -USR1 通知 Nginx 重开日志文件,而不是直接 mv 或 cp —— 这样能避免写入间隙
  2. 加上 compressdelaycompress:旧日志先压缩,下次轮转时再压上一轮,防止正在写的文件被误操作
  3. 使用 dateext(如 %Y%m%d)替代数字序号,便于识别和归档;搭配 rotate 7 可控保留周期
  4. 示例片段:

    /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

    }

从源头减少单条日志体积

压缩只能减存量,精简格式才是控增量的核心。

  1. 检查 log_format,去掉非必要字段:比如 $http_x_forwarded_for$request_time$upstream_response_time 若不用于分析,可删减
  2. 避免记录静态资源(js/css/img等):用 map 指令过滤,只对非静态路径记录 access 日志
  3. 按业务分离日志:把 API 接口、管理后台、前端页面分别写入不同文件,便于针对性清理或降级采样

按需启用条件日志与采样记录

高流量场景下,不是每条请求都值得全量记录。

  1. if 参数控制日志开关,例如只记录状态码 ≥400 的错误请求:

    access_log /var/log/nginx/error_only.log main if=$loggable;

    再配合 map $status $loggable { ~^[45] 1; default 0; }

  2. 对正常访问做采样,比如每 100 条记 1 条:

    map $remote_addr $sampled { default 0; "~^.*$" 1; } # 更实用的是基于 $request_id 或哈希取模(需自定义逻辑)

  3. error.log 本身量小,但若频繁报 warn 级别,可调高 error_log 级别为 errorcrit,减少冗余输出

验证与兜底建议

上线前务必实测,避免配置失误导致日志静默丢失。

  1. logrotate -d -f /etc/logrotate.d/nginx 先跑 debug 模式,确认路径、权限、信号发送无误
  2. 切割后立即检查:

    ls -lt /var/log/nginx/ 看新文件是否生成且大小在增长

    tail -f /var/log/nginx/access.log 确认实时写入未中断

    zcat /var/log/nginx/access.log-20260819.gz | head -5 验证压缩内容完整

  3. 临时保留一周原始未压缩备份,确认无异常后再全面启用压缩

热门栏目