Ubuntu 环境下 Java 日志的组成与定位
在 Ubuntu 上,Java 相关日志通常来自四个层面:应用业务日志、JVM 运行日志(GC、线程)、JVM 致命错误日志(hs_err)、以及系统级日志。下面按来源说明各自包含的关键信息与典型字段。
一 应用业务日志
- 来源与载体:由 Log4j、Logback、SLF4J、java.util.logging 等日志框架输出,写入应用配置的日志文件,或打印到 stdout/stderr。
- 典型字段:
- 时间戳(精确到毫秒)
- 日志级别(如 DEBUG、INFO、WARN、ERROR)
- 线程名/线程ID
- 类名/方法名(或 logger 名称)
- 日志消息(含业务上下文)
- 可选的 MDC/NDC 上下文(如请求ID、租户ID)
- 示例格式:
- 2023-10-01 10:00:00 INFO [main] com.example.MyClass - Application started
- 用途:业务链路追踪、错误定位、审计与统计。
二 JVM 运行日志 GC 与线程
- GC 日志
- 作用:观察 年轻代/老年代 回收行为、停顿时间、晋升失败等。
- 常见 JVM 参数:
- -XX:+PrintGCDetails(详细 GC 信息)
- -XX:+PrintGCTimeStamps(GC 时间戳)
- -Xloggc:<file_path>(GC 日志文件路径)
- 关键信息:GC 类型(如 G1、Parallel、ZGC)、各代容量与使用情况、回收前后内存变化、总停顿时间等。
- 线程相关
- 线程快照:使用 jstack 输出所有线程的 栈轨迹、状态(RUNNABLE、BLOCKED、WAITING)、锁持有与等待关系,用于定位 死锁/阻塞/高占用 等问题。
- 可视化工具:jconsole、VisualVM 可在线查看线程、内存与 CPU 概况。
三 JVM 致命错误日志 hs_err_pid.log
- 触发时机:发生 HotSpot 无法恢复的致命错误(如 EXCEPTION_ACCESS_VIOLATION 访问非法地址)时自动生成,文件名形如 hs_err_pid.log。
- 关键信息:
- 崩溃概要 与错误类型
- 寄存器/线程状态 快照
- 堆栈信息(Java 与 native)
- 加载的共享库 与可能的本地代码问题线索
- 环境信息(JVM 版本、启动参数、操作系统与 CPU 等)
- 用途:定位 JVM 崩溃、本地库冲突、硬件指令异常等难以通过业务日志发现的问题。
四 系统级日志
- 日志位置与机制:
- Ubuntu 常用 systemd-journald,日志以二进制形式保存在 /var/log/journal/;同时常配合 rsyslog 输出到 /var/log/syslog。传统 /var/log/messages 在 Ubuntu 上通常不存在或为空(除非特别配置)。
- 与 Java 相关的典型线索:
- OOM killer 终止 Java 进程(内存不足)
- abrt-hook-ccpp 记录的 SIGABRT 崩溃与 core dump 通知
- JVM 或启动脚本通过 syslog 输出的启动/停止/告警信息
- 常用查看方式:journalctl -u (按服务过滤)、tail/less/grep 查看 /var/log/syslog。
五 快速定位与常用命令
- 查看应用日志:
- 实时跟踪:tail -f /path/to/app.log
- 关键字检索:grep “ERROR” /path/to/app.log
- 大文件分页:less /path/to/app.log
- 获取线程快照与监控:
- 线程分析:jstack > thread_dump.txt
- 动态观测:jconsole / VisualVM
- GC 日志:
- 实时查看:tail -f /var/log/java/gc.log
- 系统线索:
- 服务日志:journalctl -u your-java-service
- 综合系统日志:grep -i “java|oom|abrt” /var/log/syslog
- 分析建议:结合 日志级别 与 时间窗口 过滤,必要时引入 ELK/Graylog 做聚合与可视化。