JDK 11统一日志管理


文章目录

  • JDK 11统一日志管理
  • 默认配置
  • 在运行时控制日志
  • -Xlog标签和级别
  • -Xlog输出
  • 装饰器
  • 使用示例
  • 旧式GC日志和Xlog的对照
  • 旧式运行时日志和Xlog的对照
  • 参考文档


TIPS

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

可使用-Xlog选项,启用统一日志管理。

Xlog选项支持的参数如下:

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

其中:

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

默认配置

如果只指定了 -Xlog ,则使用默认配置,等价于如下配置:

-Xlog:all=warning:stdout:uptime,level,tags

在运行时控制日志

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

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级别同时打印gcergo消息的组合。该信息包括有关堆大小和收集集构造的所有详细信息。

-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表示禁用所有的装饰器。

下表展示了所有可用的装饰器:

装饰器

描述

timeor t

ISO-8601格式的当前日期时间

utctimeor utc

Universal Time Coordinated or Coordinated Universal Time.

uptimeor u

JVM启动了多久,以秒或毫秒为单位。例如6.567s.

timemillisor tm

相当于 System.currentTimeMillis()

uptimemillisor um

JVM启动以来的毫秒数

timenanosor tn

相当于 System.nanoTime()

uptimenanosor un

JVM启动以来的纳秒数

hostnameor hn

主机名

pidor p

The process identifier.

tidor ti

打印线程号

levelor l

与日志消息关联的级别

tags or tg

与日志消息关联的标签集

使用示例

# 示例1:使用info级别记录所有信息到stdout,装饰器使用uptime、level及tags
# 等价于-Xlog:all=info:stdout:uptime,levels,tags
-Xlog

# 示例2:以info级别打印使用了gc标签的日志到stdout
-Xlog:gc

# 示例3:使用默认装饰器,info级别,将使用gc或safepoint标签的消息记录到stdout。
# 如果某个日志同时标签了gc及safepoint,不会被记录
-Xlog:gc,safepoint

# 示例4:使用默认装饰器,debug级别,打印同时带有gc和ref标签的日志。
# 仅使用gc或ref的日志不会被记录
-Xlog:gc+ref=debug

# 示例5:不使用装饰器,使用debug级别,将带有gc标签的日志记录到gc.txt中
-Xlog:gc=debug:file=gc.txt:none

# 示例6:以trace级别记录所有带有gc标签的日志到gctrace.txt文件集中,该文件集中的文件最大1M,保留5个文件;使用的装饰器是uptimemillis、pids
-Xlog:gc=trace:file=gctrace.txt:uptimemillis,pids:filecount=5,filesize=1024

# 示例7:使用trace级别,记录至少带有gc及meta标签的日志到gcmetatrace.txt,同时关闭带有class的日志。某个消息如果同时带有gc、meta及class,将不会被记录,因为class标签被关闭了。
-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

注意: PrintGCApplicationConcurrentTimePrintGCApplicationStoppedTime是记录在同一tag之上的,并且没有被分开

PrintGCApplicationStoppedTime

-Xlog:safepoint

注意: PrintGCApplicationConcurrentTimePrintGCApplicationStoppedTime是记录在同一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提供越来越多的信息。

参考文档