日志检索的要点
在日志里找线索靠 grep,但真正决定效率的是两件事:拿到足够的上下文,以及能覆盖轮转历史。只看到一行 error 而没有前后文,往往无法判断是孤立报错还是某次请求链条的终点;只看当前日志文件,则会漏掉问题发生前已经被轮转压缩的部分。所以成熟的检索习惯是「区分大小写与模式转义要正确、带上若干行上下文、并把压缩日志一起搜」。
基本信息
| 适用平台 | Linux、macOS、BSD(GNU grep / BSD grep);zgrep、zcat 需要 gzip 工具集 |
|---|---|
| 命令语法 | grep [选项] 模式 文件...;压缩日志用 zgrep [选项] 模式 文件.gz |
| 常用选项 | -i 忽略大小写、-n 行号、-C N 前后各 N 行、-A/-B 只取后/前若干行、-E 扩展正则、-F 固定字符串、-m N 命中 N 条即停、--color=auto 高亮、-r 递归、--include 限定文件 |
| 权限要求 | 读取日志需要文件读权限,/var/log 下多数文件只对 root 与特定组开放 |
| 时间维度 | grep 只能做模式匹配,无法比较时间;按时间窗过滤要用 awk 解析时间字段,或改用 journalctl --since |
典型使用场景
- 定位报错:先按关键字找到行号,再用上下文还原前后调用链
- 统计错误频次:筛出错误行后交给 sort 与 uniq -c 排行
- 跨轮转检索:用 zgrep 一次搜完当前日志与历史压缩日志
- 多模式联查:用 -E 把多个关键字合并成一次检索,减少重复操作
- 实时过滤:配合 tail -F 与 --line-buffered 观察新产生的错误
- 范围收窄:用 --include 与前缀路径限定只搜相关组件的日志
常用示例
常用示例
grep -i 'error' /var/log/myapp.log | tail -n 20
grep -n -C3 'NullPointer' app.log # 带前后 3 行上下文
grep -E 'timeout|refused|failed' app.log
grep -F '10.0.0.5:8080' app.log # 固定字符串,点号按字面量匹配
grep -m 5 -A2 'PANIC' app.log # 命中 5 条即停,附后两行
zgrep 'error' /var/log/myapp.log-20261010.gz # 检索轮转压缩日志
zcat app.log.*.gz | grep -c 'ERROR' # 统计历史压缩日志里的错误数
tail -F app.log | grep --line-buffered -iE 'error|panic'
awk '$1 " " $2 >= "2026-10-12 09:00" && $1 " " $2 <= "2026-10-12 10:00"' app.log选项对照
| 选项 | 作用 | 注意 |
|---|---|---|
| -C N | 输出匹配行前后各 N 行 | 匹配行密集时会重复输出,量大时用 -A 或 -B |
| -F | 按固定字符串匹配 | 搜 IP、路径、含点号的字符串时最稳妥 |
| -E | 使用扩展正则 | 多个关键字用竖线合并,一次搞定 |
| -m N | 命中 N 条即停止 | 大文件里做存在性判断很省时间 |
| --line-buffered | 逐行刷新输出 | 与 tail -F 联用时必需,否则看不到实时内容 |
| --include | 限定参与搜索的文件模式 | 递归搜索时避免把无关文件一起读 |
搜索压缩日志有两种方式:zgrep 最省事,它内部解压后交给 grep,参数基本通用;要跨多个压缩文件做统计则用 zcat 或 zstdcat 加管道。日志被轮转成多份时,注意按文件名排序得到的时间顺序,避免把汇总结果当成时间线。
需要按时间范围过滤时,grep 无能为力,因为它是纯模式匹配。日志行首是标准时间戳的情况下,用 awk 做字符串比较即可(时间戳格式统一时可直接比较);如果日志进了 systemd,直接用 journalctl -u 单元名 --since '2026-10-12 09:00' --until ... 要简单得多。
只看命中行不看上下文,很容易误判:一条 error 可能只是某次重试的正常记录,而真正的根因在几行之前。排查重要故障时养成带 -C 的习惯,并保留原始输出片段,便于复盘与给出结论。
检索组合选择
| 目标 | 写法要点 | 说明 |
|---|---|---|
| 固定字符串 | 使用固定串匹配选项 | 避免正则字符被解释 |
| 需要上下文 | 指定前后行数 | 不要只截取命中行 |
| 压缩历史 | 用压缩感知的检索命令 | 直接搜压缩文件只会看到二进制提示 |
| 实时过滤 | 跟随输出接检索并启用行缓冲 | 否则看不到即时输出 |
| 排除噪声 | 反向匹配 | 逐步收窄到关键行 |
多文件检索时让输出带上文件名,能直接看出是哪台组件出的问题;跨多台机器排查时在每台机器上各自检索再汇总,比把日志集中搬运后再搜更快也更省流量。时间范围已知时应先按文件与时间缩小范围,再叠加关键字,检索速度差别明显。