Java日志在CentOS上如何进行故障排查
小樊
31
2025-12-23 12:49:35
Java日志在CentOS上的故障排查流程
一 定位日志来源与快速查看
- 应用日志:优先在应用的安装目录下的 logs/ 查找,或使用配置文件中指定的路径;用命令行快速查看与检索:
- 查看文件:cat、less、tail -f /path/to/app.log
- 关键字检索:grep -n “ERROR|Exception” /path/to/app.log
- 系统服务日志:若以 systemd 管理,使用 journalctl -u your-app.service 查看标准输出与启动失败原因;必要时查看系统日志 /var/log/messages、/var/log/syslog。
- 崩溃日志:JVM 异常退出时会在工作目录生成 hs_err_pid.log*,内含 SIGSEGV、寄存器、线程栈、JVM 版本等关键信息,是定位 JNI/段错误/内存访问违规 的首要线索。
二 常见故障场景与对应处理
- 日志配置未生效或“全是 INFO”
- 确认配置文件在 classpath(如 src/main/resources),路径与文件名正确;检查应用对配置文件的读权限。
- 避免多套日志框架冲突(如 Log4j/Logback/SLF4J 混用导致绑定错实现);确保依赖一致。
- 显式指定配置或临时调高日志级别:
- Log4j:java -Dlog4j.configuration=file:/path/to/log4j.properties -jar app.jar
- Logback:java -Dlogback.configurationFile=/path/to/logback.xml -jar app.jar
- 将 rootLogger 或 调整为 DEBUG 验证输出,再收敛到合适的 INFO/WARN/ERROR。
- 应用异常退出且无业务日志线索
- 检查工作目录或启动目录是否存在 hs_err_pid.log*;根据错误类型(如 SIGSEGV)判断是否为 JNI、本地库、硬件或 JVM Bug 引起;必要时升级 JDK、回退本地库或调整 GC/堆参数。
- 内存问题(OutOfMemoryError、频繁 Full GC)
- 先用 jstat -gc 观察 YGC/FGC、Eden/Survivor/Old 使用趋势;必要时用 jmap -dump:format=b,file=heap.hprof 导出堆转储,使用 Eclipse MAT 分析泄漏对象与引用链;临时缓解可适度调大 -Xmx/-Xms 并优化对象生命周期与缓存策略。
- 系统资源与依赖异常
- 用 top/htop 观察 CPU/内存/IO;用 pidstat -u -p 聚焦进程级 CPU;检查 数据库连接、网络连通性、磁盘空间 等外部依赖;确认 JAVA_HOME/PATH 与 JDK 版本一致,避免因版本差异导致行为变化。
三 高效排查命令清单
- 进程与资源:ps -ef | grep java;top/htop;pidstat -u -p ;free -m;df -h
- JVM 诊断:jstat -gc ;jmap -dump:format=b,file=heap.hprof ;jstack > threads.txt
- 日志与系统:tail -f app.log | grep -i error;journalctl -u your-app.service -b;less hs_err_pid.log*;cat /var/log/messages | tail -n 200
- 崩溃分析:阅读 hs_err_pid.log* 的 “Problematic frame”“Stack Trace”“Signal” 等关键段落,定位是 JVM 内部、JNI 还是 本地库 问题。
四 日志治理与预防
- 日志轮转:使用 logrotate 防止日志无限增长,示例配置 /etc/logrotate.d/your-app:
- /path/to/app.log {
- daily
- missingok
- rotate 7
- compress
- notifempty
- create 640 root root
- }
- 运行与维护:变更配置或修复后通过 systemctl restart your-app-service 生效;将 DEBUG 仅用于短时排障,生产以 INFO/WARN/ERROR 为主并配合采样/异步打点降低开销;必要时引入 ELK/Graylog 做集中化收集、检索与告警。