在 CentOS 上定位 Java 日志错误,一般可以从日志文件、进程状态、系统日志、 JVM 参数几个层面入手。下面按实战流程说明。
不同方式日志位置不同:
journalctllogs/ 目录docker logs# Spring Boot / 普通 Java
/opt/app/logs/
/var/log/app/
~/logs/
# Tomcat
/opt/tomcat/logs/catalina.out
查看错误:
grep -i error /opt/app/logs/app.log
grep -i exception /opt/app/logs/app.log
# 查看服务名
systemctl list-units | grep java
# 查看日志
journalctl -u your-service.service -n 200 --no-pager
# 实时日志
journalctl -u your-service.service -f
JVM 崩溃会生成:
hs_err_pid<pid>.log
查找:
find / -name "hs_err_pid*.log" 2>/dev/null
重点看:
Problematic frameSIGSEGVOutOfMemoryps -ef | grep java
jps -l
如果进程挂了:
echo $?
JVM 参数应类似:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/java/heapdump.hprof
查找 dump:
find / -name "*.hprof" 2>/dev/null
jstat -gcutil <pid> 1000
jstack <pid> > thread.txt
重点看:
BLOCKEDdeadlock# 系统日志
/var/log/messages
# 内核 / OOM Killer
dmesg | grep -i kill
grep -i "out of memory" /var/log/messages
如果是被 OOM Killer 杀掉:
dmesg -T | grep -i "killed process"
ps -ef | grep javajstack + 应用日志journalctl / dmesg / hs_errException、Error、OOM、SIGSEGVjournalctl -u demo.service --since "10 min ago"
grep -A 20 "Exception" /var/log/demo/app.log
如果你愿意,可以告诉我:
我可以给你精确到命令级的定位方案。