问题出现得很突然,日志倒是留得挺全。logrotate 每天把 nginx 与应用的 access.log 压成 .gz,运维用 grep 搜昨天的请求 id 一条都搜不到,加 -r 也没用,看目录里确实有 access.log-20261110.gz,文件大小 1.2GB。

刚开始盯着「压缩任务在凌晨跑,昨天的记录跨了两个文件」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。grep 默认不读 gzip 压缩内容,需要 zgrep 或 zcat 管道。少数情况下是日志被切割后新写入进了新文件,搜的是当前那个空文件。

少数情况下是搜索目录没带对,实际文件在别的挂载点。

第一件事是确认目标文件是不是压缩格式

file /var/log/nginx/access.log-20261110.gz

随后用 zgrep 直接搜压缩文件

zgrep -c 'req-20261110-8821' /var/log/nginx/access.log-20261110.gz

跨多个归档一起搜

zcat /var/log/nginx/access.log-*.gz | grep -c 'req-20261110-8821'

末了确认切割时间点与检索范围是否匹配

ls -l --time-style=full-iso /var/log/nginx/access.log*

怎么算真的好了,看的是同一批现象。zgrep 能在归档里搜到目标请求 id,条数与网关统计一致,跨天边界的两段记录都能被找到。

这里还有个坑。归档文件是压缩的,grep 看不见内容也不会报错,搜索脚本里统一用 zgrep 能省掉这类静默失败。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189