温馨提示×

Ubuntu下Java日志如何进行故障排查

小樊
43
2026-01-08 07:51:58
栏目: 编程语言

Ubuntu下Java日志故障排查实操指南

一、快速定位路径与先决检查

  • 确认环境:执行java -versionjavac -version检查版本;必要时设置JAVA_HOMEPATH,确保运行与编译一致。
  • 找到进程:用jps -lps -ef | grep java定位PID
  • 直连诊断:使用jconsole VisualVM观察线程、内存、类加载等实时状态。
  • 系统侧线索:查看系统日志**/var/log/syslog/var/log/messages**,捕捉OOM Killer、磁盘满、信号终止等系统事件。
  • Web容器:如为Tomcat,同步检查其catalina.out与**logs/**目录下的应用日志。

二、应用日志框架与级别配置

  • 明确框架:常见为LogbackLog4j2java.util.logging(JUL);优先使用SLF4J作为门面统一API。
  • 临时提升日志级别:在不改代码的前提下,优先修改框架配置文件(如logback.xmllog4j2.xmllogging.properties),将问题包的日志级别调为DEBUG/TRACE;必要时在代码中动态设置(Log4j、Logback均支持)。
  • 输出到文件并滚动:配置RollingFileAppender/TimeBasedRollingPolicy,避免单文件过大;示例见下文“可直接套用的最小配置”。
  • 异步与性能:高并发场景建议开启AsyncAppender,降低日志I/O对业务线程的影响。

三、JVM与系统层面的关键日志

  • GC日志:启动时加入**-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/var/log/java/gc.log**,用tail -f实时观察;配合jstat -gcutil 1000查看YGC/FGC频率与耗时,判断是否因GC导致停顿或OOM。
  • 堆与线程取证:
    • 堆内存:jmap -heap 快速看堆配置与使用情况;发生OutOfMemoryError时加上**-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/dump.hprof生成堆转储,后续用Eclipse MAT**分析泄漏根因。
    • 线程快照:jstack > thread_dump.txt抓取线程栈,排查死锁/阻塞/高CPU;必要时多次抓取做对比。
  • 资源与磁盘:用top/htopfree -mvmstat观察CPU/内存压力;用df -h确认日志盘与数据盘是否写满

四、常见症状与对应动作清单

症状 优先动作 关键命令或配置
启动失败/类找不到 核对classpath与依赖版本 java -cp “.:/path/lib.jar” YourMainClass;检查依赖冲突
CPU飙高 抓取线程栈定位热点 jstack > td.txt;top -H -p
频繁Full GC/停顿长 打开GC日志并分析趋势 -Xloggc;jstat -gcutil 1000
进程突然退出 查系统日志与OOM线索 tail /var/log/syslog;-XX:+HeapDumpOnOutOfMemoryError
磁盘写满 清理旧日志/调整滚动策略 logback TimeBasedRollingPolicy;logrotate
Web请求异常 同步查看容器与应用日志 tail -f logs/catalina.out app.log

五、可直接套用的最小配置示例

  • Logback(推荐与SLF4J搭配)
<configuration>
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/app.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level="INFO">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
  </root>
  <!-- 临时调试某个包 -->
  <logger name="com.example" level="DEBUG"/>
</configuration>
  • Log4j2(RollingFile)
<?xml version="1.0" encoding="UTF-8"?>
<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>
  • 运行参数建议(放在服务启动脚本或systemd Environment中)
JAVA_OPTS="-Xms512m -Xmx2048m \
  -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/var/log/java/gc.log \
  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/java/dumps/"
  • 日志轮转(Ubuntu常用logrotate,/etc/logrotate.d/java-app)
/var/log/java/*.log {
  daily
  rotate 30
  missingok
  compress
  delaycompress
  copytruncate
  notifempty
}

提示:生产环境将root level设为INFO/WARN,仅在排障时临时调为DEBUG;开启异步日志可减少I/O抖动。

0