温馨提示×

Ubuntu Java日志错误排查步骤

小樊
41
2025-12-25 16:53:40
栏目: 编程语言

Ubuntu Java日志错误排查步骤

一 快速定位与日志收集

  • 确认环境:检查 Java 是否正确安装与版本匹配,命令:java -versionjavac -version。若未安装,先安装 default-jdk
  • 找到进程:获取 PID,命令:ps -ef | grep javajps
  • 实时看应用输出:若应用由服务托管,优先查看其日志文件;若直接运行或输出被重定向,实时查看标准输出与错误输出:tail -f /proc//fd/1tail -f /proc//fd/2
  • 系统侧线索:查看系统日志,命令:tail -n 100 /var/log/syslog,排查内核、OOM、系统服务等对 Java 进程的影响。
  • 若为 Web 应用(如 Tomcat):同时检查其 catalina.out 与应用日志目录中的异常堆栈与启动失败信息。

二 应用日志框架与输出配置

  • 明确日志框架:确认项目使用的日志框架(如 Log4j2Logbackjava.util.logging),不同框架的配置文件与级别开关不同。
  • 临时提升日志级别:为快速暴露问题,将根日志级别调为 DEBUG(或框架等效级别),观察更细粒度日志后再恢复。
  • 配置滚动文件输出:确保日志写入文件并做按大小/时间滚动,便于回溯且不撑满磁盘。
  • 示例(Logback 片段):
    <configuration>
      <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      </appender>
      <root level="debug">
        <appender-ref ref="console"/>
      </root>
    </configuration>
    
  • 示例(Log4j2 RollingFile 片段):
    <Configuration status="WARN">
      <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="logs/app-%d{yyyy-MM-dd}-%i.log.gz">
          <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
          <Policies><SizeBasedTriggeringPolicy size="10MB"/></Policies>
          <DefaultRolloverStrategy max="10"/>
        </RollingFile>
      </Appenders>
      <Loggers>
        <Root level="info"><AppenderRef ref="Console"/><AppenderRef ref="RollingFile"/></Root>
      </Loggers>
    </Configuration>
    
  • 分析工具:小规模可用 grep/awk/sed 检索关键字;中大型建议接入 ELK Stack(Elasticsearch, Logstash, Kibana)Graylog 做集中检索与可视化。

三 运行期诊断与线程内存分析

  • 线程堆栈:抓取线程快照定位死锁、阻塞与高占用线程,命令:jstack ;必要时多次采样对比。
  • GC 监控:观察 GC 频率与回收效果,命令:jstat -gcutil 1000(每 1000ms 输出一次);若 Full GC 频繁,结合堆分析。
  • 堆内存分析:发生 OutOfMemoryError 时,开启 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump 生成 Heap Dump,使用 Eclipse MAT 分析泄漏与大对象。
  • 资源与系统日志联动:配合 top/htopfree -mdf -h/var/log/syslog 检查 CPU/内存/磁盘 与系统事件,排除外部资源瓶颈或 OOM-killer 影响。

四 常见错误场景与修复建议

  • 内存不足或泄漏:表现为 OutOfMemoryError、频繁 Full GC、应用变慢后崩溃。建议:合理设置 -Xms/-Xmx,开启 Heap Dump 并用 MAT 定位泄漏点,优化缓存/集合使用与对象生命周期。
  • 未捕获异常导致退出:应用无顶层异常处理器时,未捕获异常可致进程退出。建议:在关键入口添加全局异常日志,并确保日志框架已正确初始化。
  • 日志文件过大或磁盘写满:无滚动策略时易占满磁盘,导致写入失败或系统异常。建议:启用按大小/时间滚动并限制保留个数,监控 df -h 与日志目录使用率。
  • 依赖或类路径问题:出现 ClassNotFoundException/NoClassDefFoundError。建议:核对 classpath 与依赖包是否完整,使用构建工具(如 Maven/Gradle)管理依赖并校验发布包内容。
  • Java 版本不兼容:运行期出现 UnsupportedClassVersionError 或行为异常。建议:统一开发与运行 Java 版本,必要时切换 JAVA_HOME 与系统默认 java

五 高效排查命令清单

  • 环境确认:java -versionjavac -version
  • 进程定位:ps -ef | grep javajps
  • 实时输出:tail -f /proc//fd/1tail -f /proc//fd/2
  • 系统日志:tail -n 100 /var/log/syslog
  • 线程与 GC:jstack jstat -gcutil 1000
  • 资源监控:top/htopfree -mdf -h
  • 堆分析:启动时加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path,再用 Eclipse MAT 分析

0