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
每个日志消息都有一个级别和与之关联的tag集合。消息的级别与其详细信息相对应,tag集与消息包含的内容或者消息所涉及的JVM组件(例如GC、编译器或线程)相对应。
可用的日志级别:
offtracedebuginfowarningerror可用的日志标签( 如指定为all,则表示下面所有标签的组合):
addageallocannotationaotargumentsattachbarrierbiasedlockingblocksbotbreakpointbytecodecensusclassclasshistocleanupcompactioncomparatorconstraintsconstantpoolcoopscpucsetdatadefaultmethodsdumpergoeventexceptionsexitfingerprintfreelistgchashtablesheaphumongousihopiklassinititablesjfrjnijvmtilivenessloadloaderloggingmarkmarkingmetadatametaspacemethodmmumodulesmonitorinflationmonitormismatchnmethodnormalizeobjecttaggingobsoleteoopmapospagesizeparserpatchpathphasesplabpreorderpromotionprotectiondomainpurgeredefinerefrefineregionremsetresolvesafepointscavengescrubsettingstackmapstacktracestackwalkstartstartuptimestatestatsstringdedupstringtablesubclasssurvivorsweepsystemtaskthreadtimetimertlabunloadupdateverificationverifyvmoperationvtablesworkgang下表描述了标签和级别的组合:
| 日志标签 | 描述 |
|---|---|
-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 支持以下类型的输出:
stdout :将输出发送到标准输出stderr :将输出发送到stderrfile=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配置 | 注释 |
|---|---|---|
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配置 | 注释 |
|---|---|---|
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提供越来越多的信息。 |