TIPS 本文基于JDK 11编写,理论适用于JDK 9及更高版本。

可使用-Xlog选项,启用统一日志管理。
Xlog选项支持的参数如下:

  • -Xlog:使用info级别启用JVM日志
  • -Xlog:help:打印Xlog帮助文档
  • -Xlog:disable:关闭所有日志记录并清除日志记录框架的所有配置,包括警告和错误的默认配置
  • -Xlog[:option]:按照命令行上出现的顺序应用多个参数。同一输出的多个参数按其给定顺序覆盖。option的格式为:

    1. [:[what][:[output][:[decorators][:output-options[,...]]]]]

    其中:

    • what:指定level和tag的组合,格式:tag1[+tag2…][][=level][,…] 。除非用 指定了通配符,否则只有匹配了指定tag的日志消息才会被匹配。详见 Xlog标签和级别
    • output:设置输出类型。默认为stdout,详见 Xlog输出
    • decorators:使用一系列自定义的装饰器去配置output。缺省的装饰器为uptime、level和tags。详见 装饰器
    • output-options:设置Xlog的日志输出选项,格式:
      1. filecount=file-count filesize=file size with optional K, M or G suffix

      默认配置

      如果只指定了 -Xlog ,则使用默认配置,等价于如下配置:
      1. -Xlog:all=warning:stdout:uptime,level,tags

      在运行时控制日志

      可用jcmd的 VM.log 诊断命令在运行时控制日志记录。例如:
      1. jcmd 48758 VM.log output what

      -Xlog标签和级别

      每个日志消息都有一个级别和与之关联的tag集合。消息的级别与其详细信息相对应,tag集与消息包含的内容或者消息所涉及的JVM组件(例如GC、编译器或线程)相对应。
      可用的日志级别:
  • off

  • trace
  • debug
  • info
  • warning
  • error

可用的日志标签( 如指定为all,则表示下面所有标签的组合):

  • add
  • age
  • alloc
  • annotation
  • aot
  • arguments
  • attach
  • barrier
  • biasedlocking
  • blocks
  • bot
  • breakpoint
  • bytecode
  • census
  • class
  • classhisto
  • cleanup
  • compaction
  • comparator
  • constraints
  • constantpool
  • coops
  • cpu
  • cset
  • data
  • defaultmethods
  • dump
  • ergo
  • event
  • exceptions
  • exit
  • fingerprint
  • freelist
  • gc
  • hashtables
  • heap
  • humongous
  • ihop
  • iklass
  • init
  • itables
  • jfr
  • jni
  • jvmti
  • liveness
  • load
  • loader
  • logging
  • mark
  • marking
  • metadata
  • metaspace
  • method
  • mmu
  • modules
  • monitorinflation
  • monitormismatch
  • nmethod
  • normalize
  • objecttagging
  • obsolete
  • oopmap
  • os
  • pagesize
  • parser
  • patch
  • path
  • phases
  • plab
  • preorder
  • promotion
  • protectiondomain
  • purge
  • redefine
  • ref
  • refine
  • region
  • remset
  • resolve
  • safepoint
  • scavenge
  • scrub
  • setting
  • stackmap
  • stacktrace
  • stackwalk
  • start
  • startuptime
  • state
  • stats
  • stringdedup
  • stringtable
  • subclass
  • survivor
  • sweep
  • system
  • task
  • thread
  • time
  • timer
  • tlab
  • unload
  • update
  • verification
  • verify
  • vmoperation
  • vtables
  • workgang

下表描述了标签和级别的组合:

日志标签 描述
-Xlog:gc 打印 gc 信息以及垃圾回收发生的时间。
-Xlog:gc* 打印至少包含 gc 标签的日志消息。它还可以具有与其关联的其他标签。但是,它不会提供phase级别信息。
-Xlog:gc*=trace 打印trace级别及更高的gc日志记录信息。输出显示所有gc相关标签以及详细的日志记录信息。
-Xlog:gc+phases=debug 打印不同的phase级别信息。这提供了在debug级别记录的详细信息级别。
-Xlog:gc+heap=debug 在gc之前和之后打印堆的使用详细。这将会以debug级别打印带有tag和heap的标记的日志
-Xlog:safepoint 在同一级别上打印有关应用并发时间(application concurrent time)和停顿时间(application stop time)的详细信息。
-Xlog:gc+ergo*=trace 以trace 级别同时打印gc和ergo消息的组合。该信息包括有关堆大小和收集集构造的所有详细信息。
-Xlog:gc+age=trace 以trace级别 打印存活区的大小、以及存活对象在存活区的年龄分布
-Xlog:gc*:file=::filecount=,filesize= 将输出重定向到文件,在其中指定要使用的文件数和文件大小,单位 kb

-Xlog输出

-Xlog 支持以下类型的输出:

  • stdout :将输出发送到标准输出
  • stderr :将输出发送到stderr
  • file=filename :将输出发送到文本文件。你还可以让文件按照文件大小轮换,例如每记录10M就轮换,只保留5个文件等。默认情况下,最多保留5个20M的文件。可使用 filesize=10M, filecount=5 格式去指定文件大小和保留的文件数。

    装饰器

    装饰器用来装饰消息,记录与消息有关的信息。可以为每个输出配置一组自定义的装饰器,输出顺序和定义的顺序相同。缺省的装饰器为uptime、level和tags。none表示禁用所有的装饰器。
    下表展示了所有可用的装饰器:
装饰器 描述
time or t ISO-8601格式的当前日期时间
utctime or utc Universal Time Coordinated or Coordinated Universal Time.
uptime or u JVM启动了多久,以秒或毫秒为单位。例如6.567s.
timemillis or tm 相当于 System.currentTimeMillis()
uptimemillis or um JVM启动以来的毫秒数
timenanos or tn 相当于 System.nanoTime()
uptimenanos or un JVM启动以来的纳秒数
hostname or hn 主机名
pid or p The process identifier.
tid or ti 打印线程号
level or l 与日志消息关联的级别
tags or tg 与日志消息关联的标签集

使用示例

  1. # 示例1:使用info级别记录所有信息到stdout,装饰器使用uptime、level及tags
  2. # 等价于-Xlog:all=info:stdout:uptime,levels,tags
  3. -Xlog
  4. # 示例2:以info级别打印使用了gc标签的日志到stdout
  5. -Xlog:gc
  6. # 示例3:使用默认装饰器,info级别,将使用gc或safepoint标签的消息记录到stdout。
  7. # 如果某个日志同时标签了gc及safepoint,不会被记录
  8. -Xlog:gc,safepoint
  9. # 示例4:使用默认装饰器,debug级别,打印同时带有gc和ref标签的日志。
  10. # 仅使用gc或ref的日志不会被记录
  11. -Xlog:gc+ref=debug
  12. # 示例5:不使用装饰器,使用debug级别,将带有gc标签的日志记录到gc.txt中
  13. -Xlog:gc=debug:file=gc.txt:none
  14. # 示例6:以trace级别记录所有带有gc标签的日志到gctrace.txt文件集中,该文件集中的文件最大1M,保留5个文件;使用的装饰器是uptimemillis、pids
  15. -Xlog:gc=trace:file=gctrace.txt:uptimemillis,pids:filecount=5,filesize=1024
  16. # 示例7:使用trace级别,记录至少带有gc及meta标签的日志到gcmetatrace.txt,同时关闭带有class的日志。某个消息如果同时带有gc、meta及class,将不会被记录,因为class标签被关闭了。
  17. -Xlog:gc+meta*=trace,class*=off:file=gcmetatrace.txt

旧式GC日志和Xlog的对照

旧式GC标记 Xlog配置 注释
G1PrintHeapRegions -Xlog:gc+region=trace -
GCLogFileSize No configuration available 日志轮换由框架处理
NumberOfGCLogFiles Not Applicable 日志轮换由框架处理
PrintAdaptiveSizePolicy -Xlog:gc+ergo*=level 使用debug级别可打印大部分信息,使用trace级别可打印所有 PrintAdaptiveSizePolicy 打印的信息
PrintGC -Xlog:gc -
PrintGCApplicationConcurrentTime -Xlog:safepoint 注意: PrintGCApplicationConcurrentTime 和 PrintGCApplicationStoppedTime 是记录在同一tag之上的,并且没有被分开
PrintGCApplicationStoppedTime -Xlog:safepoint 注意: PrintGCApplicationConcurrentTime 和 PrintGCApplicationStoppedTime 是记录在同一tag之上的,并且没有被分开
PrintGCCause Not Applicable Xlog总是会记录GC cause
PrintGCDateStamps Not Applicable 日期戳由框架记录
PrintGCDetails -Xlog:gc* -
PrintGCID Not Applicable Xlog总是会记录GC ID
PrintGCTaskTimeStamps -Xlog:gc+task*=debug -
PrintGCTimeStamps Not Applicable 时间戳由框架记录
PrintHeapAtGC -Xlog:gc+heap=trace -
PrintReferenceGC -Xlog:gc+ref*=debug 注意:旧式写法中,PrintGCDetails启用时, PrintReferenceGC 才会生效
PrintStringDeduplicationStatistics -Xlog:gc+stringdedup*=debug -
PrintTenuringDistribution -Xlog:gc+age*=level 使用debug日志级别记录最相关信息;trace级别记录所有 PrintTenuringDistribution 会打印的信息。
UseGCLogFileRotation Not Applicable 用来记录 PrintTenuringDistribution

旧式运行时日志和Xlog的对照

旧式运行时标记 Xlog配置 注释
TraceExceptions -Xlog:exceptions=info -
TraceClassLoading -Xlog:class+load=level 使用info级别记录常规信息,debug级别记录额外信息。在统一日志记录语法中, -verbose:class 等价于 -Xlog:class+load=info,class+unload=info.
TraceClassLoadingPreorder -Xlog:class+preorder=debug -
TraceClassUnloading -Xlog:class+unload=level 使用info级别记录常规信息,debug级别记录额外信息。在统一日志记录语法中, -verbose:class 等价于 -Xlog:class+load=info,class+unload=info.
VerboseVerification -Xlog:verification=info -
TraceClassPaths -Xlog:class+path=info -
TraceClassResolution -Xlog:class+resolve=debug -
TraceClassInitialization -Xlog:class+init=info -
TraceLoaderConstraints -Xlog:class+loader+constraints=info -
TraceClassLoaderData -Xlog:class+loader+data=level 使用info级别记录常规信息,debug级别记录额外信息。
TraceSafepointCleanupTime -Xlog:safepoint+cleanup=info -
TraceSafepoint -Xlog:safepoint=debug -
TraceMonitorInflation -Xlog:monitorinflation=debug -
TraceBiasedLocking -Xlog:biasedlocking=level 使用info级别记录常规信息,debug级别记录额外信息。
TraceRedefineClasses -Xlog:redefine+class*=level 使用level=info,level=debug和level=trace提供越来越多的信息。

参考文档