上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: jinchamchanwaji - 

同事查日志太慢,我现场教他一套 grep 组合拳!

[复制链接]
  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 56 天

    [LV.5]常住居民I

    166

    主题

    48

    回帖

    503

    积分

    专家

    积分
    503
    发表于 3 小时前 | 显示全部楼层 | 阅读模式

    最近组里来了个新同学,特有冲劲儿,但查日志那架势…真是让我开了眼。

    那天他写的功能在测试环境跪了,钉钉告警“叮叮当当”就冲进了群。我正好闲着呢,心想顺手帮个忙,还能展示下老同志的温暖,就溜达过去瞅了瞅。好家伙,这一瞅可不得了——只见他对着终端翻来翻去,日志一行一行地滚,眉头越皱越紧,那专注的劲儿,仿佛在字里行间寻找什么失落的人生密码…

    我憋了半天,差点没忍住:“哥们儿,你这哪是查日志啊,这简直是在跟日志‘长相厮守’啊!”
    b1cf2d0d609d0c893f6d0ec24e07d6c5.jpg

    来看看他是怎么查日志的

    他先敲了一句:

    tail -f a.log | grep "java.lang.NullPointerException"

    想着等下次报错就能立刻看到。等了半天,终于蹦出来一行:

    2025-07-03 11:38:48.339 [http-nio-8960-exec-1] [47gK4n32jEYvTYX8AYti48] [INFO] [GlobalExceptionHandler] java.lang.NullPointerException, ex: java.lang.NullPointerException
    java.lang.NullPointerException: null

    我看不下去了,提醒他:“哥们儿,你这样翻是看不到完整堆栈的啊!”
    他“噢~”地一声,仿佛顿悟了,反手就用 vi 把日志文件全打开了,开始  /NullPointerException  搜索关键词,然后一下一下按 n 往后跳……
    半分钟过去了,异常信息还是七零八落没找全。我在旁边看得心急如焚,都快给他跪下了。

    实在没忍住,我当场就给他秀了一套我压箱底的“查日志组合拳”,手把手教他怎么定位、怎么过滤、怎么追踪。他眼睛一亮,当场顿悟,连连说“妙啊”,还求我写成文章:“我前同事也这么查日志的,我得发给他拯救一下!”

    得,既然如此,我就把这几招也分享给你。下次查日志的时候,说不定也能让你身边的同事眼睛一亮

    d7e9853cf47d817d259d3fdf6f286100.jpg

    正式教学

    核心的工具其实还是 grep 命令,下面我将分场景给你讲讲我的实战经验,保证你能直接套用!

    场景一:查异常堆栈,不能只看一行!

    Java 异常堆栈通常都是多行的,仅仅用 grep "NullPointerException" 只能看到最上面那一行,问题根源在哪你压根找不到。

    这时候使用 grep-A (After) 参数来显示匹配行之后的N行。

    # 查找 NullPointerException,并显示后面 50 行
    grep -A 50 "java.lang.NullPointerException" a.log

    如果你发现异常太多,屏幕一闪而过,也可以用less加上分页查看:

    grep -A 50 "java.lang.NullPointerException" a.log | less

    在 less 视图中,你可以:

    使用 箭头↑↓ 或 Page Up/Down 键来上下滚动
    输入 G 直接翻到末尾,方便快速查看最新的日志
    输入 /Exception 继续搜索
    按 q 键退出

    这样你就能第一时间拿到完整异常上下文信息,告别反复 vi + / 的低效操作!

    场景二:实时看新日志怎么打出来的

    如果你的应用正在运行,并且你怀疑它会随时抛出异常,你可以实时监控日志文件的增长。

    使用 tail -f 结合 grep:

    # 实时监控 a.log 文件的新增内容,并只显示包含 "java.lang.NullPointerException" 的行及其后50行
    tail -f a.log | grep -A 50 "java.lang.NullPointerException"

    只要异常一出现,它就会自动打出来,堆栈信息也一并送到你面前!
    想停下?Ctrl + C
    想更准确?加 -i 忽略大小写,防止大小写拼错找不到

    看到这儿,我相信你已经摩拳擦掌了,更多的机会请戳——>机~会

    场景三:翻历史日志 or 查压缩日志

    服务器上的日志一般都会按天或按大小分割并压缩,变成 .log.2025-07-02.gz 这种格式,查找这些文件的异常信息怎么办?

    🔍 查找当前目录所有 .log 文件:

    # 在当前目录下查找所有以 .log 结尾的文件,-H 参数可以顺便打印出文件名
    grep -H -A 50 "java.lang.NullPointerException" *.log
    

    其中 -H 会帮你打印出是哪个文件中出现的问题,防止你找完还不知道是哪天的事。
    🔍 查找 .gz 文件(压缩日志):

    zgrep -H -A 50 "java.lang.NullPointerException" *.gz

    zgrep 是专门处理 .gz 的 grep,它的功能和 grep 完全一样,无需手动解压,直接开整!

    场景四:统计异常数量(快速判断异常是否频繁)

    有时候你需要知道某个异常到底出现了多少次,是偶发还是成灾,使用 grep -c(count):

    grep -c "java.lang.NullPointerException" a.log

    如果你要统计所有日志里的数量:

    grep -c "java.lang.NullPointerException" *.log

    其他常用的 grep 参数:

    表格.png

    比如:

    grep -C 25 "java.lang.NullPointerException" a.log

    这个命令就能让你一眼看到异常前后的上下文,帮助定位代码逻辑是不是哪里先出问题了。

    转载:
    作者:阿杆
    来源:稀土掘金

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表