Java應用的日志通常分布在以下位置,需根據部署方式選擇:
my-webapp.service
),使用journalctl
命令查看服務專屬日志:sudo journalctl -u your-java-service.service # 查看指定服務日志
sudo journalctl -f -n 1000 -u your-java-service.service # 實時查看最新1000行
$CATALINA_HOME/logs/catalina.out
(標準輸出)、localhost.<date>.log
(本地主機日志);spring-boot.log
(路徑可通過logging.file.name
配置),或logs/
目錄下的應用日志;log4j.properties
、logback.xml
)中的file.path
設置。/var/log/java/
目錄下生成hs_err_pid<pid>.log
文件(<pid>
為Java進程ID),包含崩潰原因(如內存溢出、非法指令)。使用grep
命令過濾日志中的關鍵信息,快速定位異常:
grep -i "error" /path/to/app.log # 不區分大小寫搜索error
grep -i "exception" /path/to/app.log # 不區分大小寫搜索exception
OutOfMemoryError
):grep -E "OutOfMemoryError|Deadlock|NullPointerException" /path/to/app.log
tail -f
結合grep
實時查看新增錯誤日志:tail -f /path/to/app.log | grep -i "error"
NullPointerException
):grep -c "NullPointerException" /path/to/app.log
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/app/gc.log -jar your-app.jar
使用VisualVM
、GCViewer
等工具打開gc.log
,查看GC頻率、耗時、內存占用趨勢,判斷是否存在內存泄漏(如老年代持續增長)。hs_err_pid<pid>.log
文件,重點關注以下內容:
OutOfMemoryError: Java heap space
、StackOverflowError
);對于海量日志,可使用工具提高分析效率:
awk
:提取日志中的特定字段(如時間戳、類名):awk '{print $1, $2, $4}' /path/to/app.log # 提取第1、2、4列(假設為時間、級別、類名)
sed
:提取包含關鍵字的行并格式化:sed -n '/ERROR/{s/.*\[(.*?)\].*/\1/p}' /path/to/app.log # 提取ERROR級別及類名
根據日志中的關鍵字快速關聯常見Java問題:
OutOfMemoryError
,查看GC日志中的老年代使用率(若持續接近100%),需調整JVM內存參數(-Xms
初始堆大小、-Xmx
最大堆大?。?。Deadlock
,查看線程轉儲(jstack <pid> > thread_dump.txt
),分析線程阻塞鏈(如多個線程互相等待鎖)。NullPointerException
,查看堆棧中的對象引用,添加空指針檢查(如if (obj != null)
)。通過以上方法,可系統性地從Ubuntu Java日志中提取關鍵信息,快速定位并解決問題。需根據實際場景選擇合適的方法(如小日志用grep
,大日志用ELK),并結合常見錯誤模式提高排查效率。