JDK9+日志Xlog的使用方式

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 个级别,从低到高为: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

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

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

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

Bash

ruby 复制代码
java -Xlog:gc:stdout:none -jar app.jar

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


4. 实用技巧

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

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

    Bash

    bash 复制代码
    java -Xlog:help

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

  2. 关闭特定日志:

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

    Bash

    ini 复制代码
    java -Xlog:all=info,gc=off -jar app.jar
  3. 兼容性提示:

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

相关推荐
直奔標竿1 小时前
Java开发者AI转型第二十三课!Spring AI个人知识库实战(二):异步ETL流水线搭建与避坑指南
java·人工智能·spring boot·后端·spring
会编程的土豆1 小时前
洛谷题单 入门1 顺序结构(go语言)
开发语言·后端·golang·洛谷
青木9602 小时前
前后端开发调试运行技巧
linux·服务器·前端·后端·npm·uv
浮尘笔记2 小时前
在Snowy后台无需编码实现自动化生成CRUD操作流程
java·开发语言·经验分享·spring boot·后端·程序人生·mybatis
希望永不加班2 小时前
SpringBoot 接口签名验证(AppKey/Secret)
java·spring boot·后端·spring
ConardLi2 小时前
开源我的 GPT-Image2 生图 Skill,附大量玩法指南
前端·人工智能·后端
fengxin_rou2 小时前
RabbitMQ安装教程:windows本地安装和docker部署
java·分布式·后端·rabbitmq
哔哩哔哩技术2 小时前
GPU隔离技术的分析与改进
后端
a8a3022 小时前
Laravel7.x核心特性全解析
java·spring boot·后端