SpringBoot怎么查看服务端的日志
一、查异常堆栈:别只看一行!
Java异常堆栈都是“连续剧”,光看第一行根本找不到病根。比如你之前看到的:
tail -f a.log | grep "java.lang.NullPointerException"
只能拿到最上面那一行,下面几十行的堆栈信息全被吃掉了。这时候得用grep -A
(A是After的缩写):
grep -A 50 "java.lang.NullPointerException" a.log
-A 50
会把匹配行后面50行全拽出来,这样就能看到完整的异常堆栈了!比如输出会像这样:
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
at com.example.service.UserService.getUser(UserService.java:42)
at com.example.controller.UserController.getUser(UserController.java:28)
...(后面还有几十行堆栈)
要是日志刷屏太快,还可以用less
分页查看:
grep -A 50 "java.lang.NullPointerException" a.log | less
在less
里按G
直接跳到末尾看最新日志,按/Exception
继续搜索,按q
退出——比你用vi
翻半天快10倍!
二、实时监控:让异常自己蹦出来
要是你怀疑应用会随时报错,想实时蹲守,可以把tail -f
和grep
结合起来:
tail -f a.log | grep -A 50 "java.lang.NullPointerException"
这样只要异常一出现,它就会={red}**自动把堆栈信息打印出来**=,连按回车都省了!比如你刚敲完命令,下一秒日志就会刷出来:
==> a.log <==
2025-07-03 11:45:23.123 [http-nio-8960-exec-5] [89hJ7k65lEYvTYX8AYti48] [ERROR] [GlobalExceptionHandler] java.lang.NullPointerException, ex: java.lang.NullPointerException
java.lang.NullPointerException: null
at com.example.service.OrderService.createOrder(OrderService.java:67)
...
想停?按Ctrl + C
就行。要是怕拼错大小写(比如写成nullpointerexception
),可以加-i
忽略大小写:
tail -f a.log | grep -i -A 50 "nullpointerexception"
三、翻历史日志:连压缩包都不用解!
服务器日志通常会按天压缩成.gz
文件,比如a.log.2025-07-02.gz
。这时候直接用grep -H
搜所有.log
文件:
grep -H -A 50 "java.lang.NullPointerException" *.log
-H
会显示文件名,比如输出会是:
a.log:2025-07-03 11:38:48.339 ...
b.log:2025-07-02 09:15:42.789 ...
要是遇到.gz
压缩文件,用zgrep
直接穿透搜索:
zgrep -H -A 50 "java.lang.NullPointerException" *.gz
zgrep
就像给grep
装了透视眼,不用解压就能直接查压缩包里的内容!比如你搜完会看到:
a.log.2025-07-02.gz:2025-07-02 14:23:56.890 ...
四、统计异常次数:看看是不是成灾了
想知道这个异常到底是偶发还是天天蹦跶?用grep -c
统计次数:
grep -c "java.lang.NullPointerException" a.log
输出就是出现的行数,比如:
12
要是想统计所有日志文件的总数:
grep -c "java.lang.NullPointerException" *.log
结果会像这样:
a.log:12
b.log:3
total:15
这样就能快速判断是不是代码有重大隐患了!
五、进阶操作:前后文一起看
有时候光看异常还不够,得结合前后日志分析。这时候可以用-B
(前面的行)、-C
(上下文)参数:
grep -C 25 "java.lang.NullPointerException" a.log
-C 25
会把匹配行={red}**前后各25行**=都显示出来,比如输出会包含异常前后的业务日志,帮你定位是不是前面某个步骤没处理好。
再比如,想找异常发生前10行的用户操作记录:
grep -B 10 "java.lang.NullPointerException" a.log
这样就能看到用户干了什么导致报错,比你一行行翻日志快多了!