如何用awk、tail、grep、sed组合拳快速查日志?

摘要:昨天临下班,生产环境出现了一个偶发的报错预警。 旁边的同事正~~准备排查,只见他输入命令 cat application.log ,一个 2GB 大小文本啊,日志哗哗刷啥也看不清,crtl + c 也停不下来了,最后轻轻的
昨天临下班,生产环境出现了一个偶发的报错预警。 旁边的同事正~~准备排查,只见他输入命令 cat application.log ,一个 2GB 大小文本啊,日志哗哗刷啥也看不清,crtl + c 也停不下来了,最后轻轻的关闭连接,又重新打开了一个~ 后端开发来说,熟练掌握 Linux 的日志分析命令是基本功,整理几一些基于 tail、less、grep、sed、awk 的日志查询场景,希望能帮你快速定位问题。 tail 很多新手习惯用 cat,但对于大文件,cat 会导致屏幕刷屏,还容易把终端卡死。tail 才是实时监控的神器。 真实场景 A:服务发版启动监控 每次发版重启服务时,我们都需要确认 Spring Boot 是否启动成功,或者有没有初始化报错。 # -f (follow):实时追加显示文件尾部内容 tail -f logs/application.log 真实场景 B:配合测试复现 Bug 测试同学说:我现在点一下按钮,你看看后台有没有报错。 此时不需要看历史日志,只需要盯着最新的输出。 # 只看最后 200 行,并保持实时刷新,避免被历史日志干扰 tail -n 200 -f logs/application.log less 如果需要查看之前的日志,推荐使用 less。不同于 vim 会一次性加载整个文件占用大量内存,less 是按需加载,打开几个 G 的文件也极其流畅,且支持向后回溯。 真实场景:追查某笔客诉订单 运营反馈:刚才 10 点左右,订单号 ORD12345678 支付失败了。 你需要从日志末尾开始,往前反向查找这个订单号。 less logs/application.log 进入界面后的操作流: Shift + G 先跳到日志最末尾(因为报错通常发生在最近)。 ?ORD12345678 输入问号+订单号,向上反向搜索。 n:如果当前这行不是关键信息,按 n 继续向上找上一次出现的位置。 Shift + F 如果看着看着,日志又更新了,按这个组合键可以让 less 进入类似 tail -f 的实时滚动模式;按 Ctrl + C 退回浏览模式。 grep grep 是最常用的搜索命令,但在实际业务中,简单的关键词搜索往往不够用。 真实场景 A:还原报错现场(关键) 只看到 NullPointerException 这一行往往无法定位问题,我们需要知道报错前的请求参数是什么,报错后的堆栈信息是什么。 此时必须配合 -C (Context) 参数。 # 搜索异常关键字,并显示该行 "前后各 20 行" grep -C 20 "NullPointerException" logs/application.log 真实场景 B:全链路追踪 TraceId 微服务我们通常会通过 TraceId 串联请求。日志文件可能发生了滚动(Rolling),变成了 app.log、app.log.1、app.log.2。 我们需要在所有日志文件中搜索同一个 TraceId。 # 搜索当前目录下所有以 app.log 开头的文件 grep "TraceId-20251219001" logs/app.log* 真实场景 C:统计异常频次 老板问:“Redis 超时异常今天到底发生了多少次?是偶发还是大规模?” 不需要数数,直接统计行数。 # -c (count):只统计匹配的行数 grep -c "RedisConnectionException" logs/application.log 真实场景 D:排除干扰噪音 排查问题时,日志里充斥着大量无关的 INFO 心跳日志或健康检查日志,严重干扰视线。 # -v (invert):显示不包含 "HealthCheck" 的所有行 grep -v "HealthCheck" logs/application.log sed 有时候日志非常大,例如有 10GB,grep 搜出来的内容依然过多。如果我们明确知道生产事故发生在 14:00 到 14:05 之间,该怎么办? 下载整个日志不现实,sed 可以帮我们把这段时间的日志单独切出来,保存成一个小文件慢慢分析。
阅读全文