前言
最近公司來了個新同事,年輕有活力,就是查日志的方式讓我有點裂開。
事情是這樣的:他寫的代碼在測試環境報錯了,報警信息也被釘釘機器人發到了我們群里。作為資深摸魚戰士,我尋思正好借機摸個魚順便指導一下新人,就湊過去看了眼。
結果越看我越急,差點當場喊出:“兄弟你是來寫代碼的,還是和日志談戀愛的?”
來看看他是怎么查日志的
他先敲了一句:
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.NullPointerExceptionjava.lang.NullPointerException: null
我提醒他:“這樣看不到堆棧信息啊。”
他“哦”了一聲,靈機一動,用 vi 把整個文件打開,/NullPointerException 搜關鍵詞,一個 n 一個 n 地翻……半分鐘過去了,異常在哪都沒找全,我都快給他跪下了。
于是我當場掏出了一套我壓箱底的“查日志組合拳”,一招一式手把手教他。他當場就“悟了”,連連稱妙,并表示想讓我寫成文章好讓他發給他前同事看——因為他前同事也是這樣查的……
現在,這套組合拳我也分享給你,希望你下次查日志的時候,能讓你旁邊的同事開開眼。
正式教學
核心的工具其實還是 grep 命令,下面我將分場景給你講講我的實戰經驗,保證你能直接套用!
場景一:查異常堆棧,不能只看一行!
Java 異常堆棧通常都是多行的,僅僅用 grep "NullPointerException" 只能看到最上面那一行,問題根源在哪你壓根找不到。
這時候使用**grep**的**-A**(After) 參數來顯示匹配行之后的 N 行。
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 :
tail -f a.log | grep -A 50 "java.lang.NullPointerException"
只要異常一出現,它就會自動打出來,堆棧信息也一并送到你面前!
- 想停下? Ctrl + C
- 想更準確?加 -i 忽略大小寫,防止大小寫拼錯找不到
服務器上的日志一般都會按天或按大小分割并壓縮,變成 .log.2025-07-02.gz 這種格式,查找這些文件的異常信息怎么辦?
查找當前目錄所有 .log 文件:
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 參數| 參數 | 作用 | | ---
| -B N | 匹配行之前的 N 行(Before) | | -A N | 匹配行之后的 N 行(After) | | -C N | 匹配行上下共 N 行(Context) | | -i | 忽略大小寫 | | -H | 顯示匹配的文件名 | | -r | 遞歸搜索目錄下所有文件 |
比如:
grep -C 25 "java.lang.NullPointerException" a.log
這個命令就能讓你一眼看到異常前后的上下文,幫助定位代碼邏輯是不是哪里先出問題了。
尾聲
好了,這套組合拳我已經傳授給你了,要是別人問你在哪學的,記得報我桿師傅的大名(doge)。
其實還有其他查日志的工具,比如 awk 、wc 等。
但是我留了一手,沒有全部教給我這個同事,畢竟江湖規則,哪有一出手就把看家本領全都交出去的道理?
如果你也想學,先拜個師交個學費(點贊、收藏、關注),等學費湊夠了,我下次再開新課,傳授給大家~
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.