JDK 9 引入了统一 JVM 日志框架 (Unified JVM Logging,JEP 158),通过一个核心参数 -Xlog 取代了过去几十个分散且命名不一致的日志开关(例如 -XX:+PrintGCDetails、-XX:+TraceClassLoading 等)。这个新框架让 JVM 日志的配置变得非常标准化和灵活。
以下是 -Xlog 的核心概念和使用方式解析:
1. 基础语法
-Xlog 的完整语法结构如下:
Plaintext
css
-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 个级别,从低到高为:
trace、debug、info(默认)、warning、error、off(关闭)。
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: 单个日志文件的最大大小(如10M、500K)。默认20M。filecount: 保留的历史日志文件数量。默认5个。
3. 常见实战配置示例
示例 1:基础的 GC 日志(替代以前的 -XX:+PrintGC)
Bash
ruby
java -Xlog:gc -jar app.jar
说明:将所有 GC 相关的 INFO 级别日志输出到控制台。
示例 2:详细的 GC 日志并输出到文件(生产环境常用)
Bash
lua
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
ruby
java -Xlog:gc+heap=debug,class+load=info -jar app.jar
说明:输出 gc 和 heap 组合的 debug 日志,同时输出类加载的 info 日志。使用逗号 , 分隔不同的配置。
示例 4:纯净输出(不带前缀)
Bash
ruby
java -Xlog:gc:stdout:none -jar app.jar
说明:打印 GC 日志到控制台,去除所有默认前缀(如 uptime 和 tags)。
4. 实用技巧
-
查看所有支持的标签和默认配置:
如果你不确定有哪些标签可用,可以在命令行执行:
Bash
bashjava -Xlog:help这会打印出 JVM 支持的所有 tags、levels、decorators 以及当前的默认设置,是一份非常好的速查手册。
-
关闭特定日志:
有时候某些日志太吵,你可以单独关闭它。例如,打印所有日志,但关闭 GC 日志:
Bash
inijava -Xlog:all=info,gc=off -jar app.jar -
兼容性提示:
如果你在 JDK 9+ 中仍然使用了旧的参数(如
-XX:+PrintGCDetails),JVM 通常会给出警告,并在后台自动将其映射转换为对应的-Xlog等效配置。但为了长远考虑,建议在升级 JDK 版本后全面迁移到-Xlog语法。