JDK9+日志Xlog的使用方式

4 阅读3分钟

JDK 9 引入了统一 JVM 日志框架(Unified JVM Logging,JEP 158),通过一个核心参数 -Xlog 取代了过去几十个分散且命名不一致的日志开关(例如 -XX:+PrintGCDetails-XX:+TraceClassLoading 等)。这个新框架让 JVM 日志的配置变得非常标准化和灵活。

以下是 -Xlog 的核心概念和使用方式解析:

1. 基础语法

-Xlog 的完整语法结构如下:

Plaintext

-Xlog[:[what][:[output][:[decorators][:[output-options]]]]]

所有部分都是可选的,使用冒号 : 分隔。如果只写 -Xlog,等同于 -Xlog:all=info:stdout:uptime,levels,tags(输出所有 INFO 级别的日志到标准输出)。


2. 四大核心组件

A. What (标签与级别)

决定记录什么内容以及记录到什么详细程度。格式为 tag1[+tag2...][*][=level][,...]

  • Tags (标签): JVM 中定义了大量标签来对日志分类,如 gc(垃圾回收)、class(类加载)、compiler(编译)、threads(线程)、safepoint(安全点)等。

    • 可以使用 + 组合标签,例如 gc+heap(必须同时包含这两个标签的日志才输出)。
    • 可以使用 * 通配符,例如 gc*(匹配所有包含 gc 标签的日志)。
  • Level (级别): 支持 6 个级别,从低到高为:tracedebuginfo(默认)、warningerroroff(关闭)。

B. Output (输出目标)

决定日志输出到哪里

  • stdout: 标准输出(默认)。
  • stderr: 标准错误。
  • file=<filename>: 输出到指定文件。例如 file=app_gc.log。可以包含 %p(进程 ID)或 %t(启动时间戳)作为变量。

C. Decorators (装饰器)

决定每行日志的前缀包含哪些元数据。多个装饰器用逗号分隔。

  • 常用装饰器:time(当前日期和时间)、uptime(JVM 启动至今的时间,默认)、pid(进程ID)、tid(线程ID)、level(日志级别,默认)、tags(日志标签,默认)。
  • 如果要关闭默认的装饰器,可以使用 none

D. Output Options (输出选项)

主要用于**日志文件的滚动(Rotation)**配置。

  • filesize: 单个日志文件的最大大小(如 10M500K)。默认 20M
  • filecount: 保留的历史日志文件数量。默认 5 个。

3. 常见实战配置示例

示例 1:基础的 GC 日志(替代以前的 -XX:+PrintGC

Bash

java -Xlog:gc -jar app.jar

说明:将所有 GC 相关的 INFO 级别日志输出到控制台。

示例 2:详细的 GC 日志并输出到文件(生产环境常用)

Bash

java -Xlog:gc*=debug:file=gc.log:time,pid,tags:filecount=10,filesize=50M -jar app.jar

说明:

  • gc*=debug: 所有包含 gc 标签的日志,输出 debug 级别。
  • file=gc.log: 输出到 gc.log 文件。
  • time,pid,tags: 每行日志前缀带有绝对时间、进程 ID 和标签。
  • filecount=10,filesize=50M: 单个文件满 50M 滚动,最多保留 10 个历史文件。

示例 3:同时配置多种日志

Bash

java -Xlog:gc+heap=debug,class+load=info -jar app.jar

说明:输出 gcheap 组合的 debug 日志,同时输出类加载的 info 日志。使用逗号 , 分隔不同的配置。

示例 4:纯净输出(不带前缀)

Bash

java -Xlog:gc:stdout:none -jar app.jar

说明:打印 GC 日志到控制台,去除所有默认前缀(如 uptime 和 tags)。


4. 实用技巧

  1. 查看所有支持的标签和默认配置:

    如果你不确定有哪些标签可用,可以在命令行执行:

    Bash

    java -Xlog:help
    

    这会打印出 JVM 支持的所有 tags、levels、decorators 以及当前的默认设置,是一份非常好的速查手册。

  2. 关闭特定日志:

    有时候某些日志太吵,你可以单独关闭它。例如,打印所有日志,但关闭 GC 日志:

    Bash

    java -Xlog:all=info,gc=off -jar app.jar
    
  3. 兼容性提示:

    如果你在 JDK 9+ 中仍然使用了旧的参数(如 -XX:+PrintGCDetails),JVM 通常会给出警告,并在后台自动将其映射转换为对应的 -Xlog 等效配置。但为了长远考虑,建议在升级 JDK 版本后全面迁移到 -Xlog 语法。