Log4j2进阶使⽤(PatternLayout详细设置)1.进阶说明
通过配置Layout打印格式化的⽇志,
Log4j2⽀持很多的Layouts:
CSV GELF HTML JSON Pattern Serialized Syslog XML YAML
本⽂仅介绍Pattern Layouts的详细使⽤。
本⽂基于。
请先参考上⾯的基本使⽤⼊门。
2.Pattern Layouts
Pattern Layouts是⼀个灵活的布局,
是最常⽤的⽇志格式配置。
该类的⽬标是格式化⼀个⽇志事件并返回结果,
结果的格式取决于转换模式。
转换模式与c语⾔中printf函数的转换模式密切相关。
转换模式由称为转换说明符的⽂字⽂本和格式控制表达式组成。
注意,任何⽂字⽂本,包括特殊字符,都可能包含在转换模式中。
特殊字符包括\t、\n、\r、\f,使⽤\输出⼀个反斜杠。
每个转换说明符以百分号(%)开头,
后⾯是可选的格式修饰符和必填的转换字符。
格式修饰符控制字段宽度、填充、左对齐和右对齐等内容。
转换字符指定数据的类型,例如⽇期、线程名、⽇志级别、⽇志名称等等。
3.⼀个简单的例⼦
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
对应输出的⽇志信息:
11:33:08.440 [main] FATAL org.apache.logging.log4j.Log4j2Test - fatal level log
详细对应关系:
数据类型转换字符输出⽇志
⽇期%d{HH:mm:ss.SSS}11:33:08.440
线程名%t main
⽇志级别%-5level FATAL
⽇志名称%logger{36}org.apache.logging.log4j.Log4j2Test
⽇志信息%msg fatal level log
换⾏%n⽇志结束换⾏
另外配置中的空⽩字符和[]-等字符都是按照原样输出的。
4.PatternLayout参数
属性说明
charset指定⽇志字符集
pattern指定⽇志输出格式
alwaysWriteExceptions默认为true,输出异常
header可选项,包含在每个⽇志⽂件的顶部
footer可选项,包含在每个⽇志⽂件的尾部
属性说明
上⾯没有把全部参数列出来,
下⾯仅介绍pattern参数的详细配置。
5.pattern属性
pattern可以配置各种类型的转换字符,
转换字符⼜称为占位符,
在打印⽇志的时候会被替换为实际的值。
转换字符说明
c{precision}
logger{precision}
输出发布⽇志事件的⽇志程序的名称。
C{precision}
class{precision}
输出发出⽇志记录请求的调⽤者的完全限定类名,可能会影响性能,谨慎使⽤。
d{pattern} date{pattern}输出⽇志事件的⽇期。⽇期转换说明符后⾯可以跟⼀组⼤括号,其中包含每个SimpleDateFormat的⽇期和时间模式字符串。
enc{pattern}
{[HTML|XML|JSON|CRLF]} encode{pattern} {[HTML|XML|JSON|CRLF]}对适合⽤特定标记语⾔输出的特殊字符进⾏编码和转义。默认情况下,如果只指定了⼀个选项,它将对HTML进⾏编码。第⼆个选项⽤于指定应该使⽤哪种编码格式。此转换器特别适⽤于对⽤户提供的数据进⾏编码,这样输出数据就不会写得不正确或不安全。
ex exception throwable 输出绑定到⽇志事件的可抛出跟踪,默认情况下,这将输出完整的跟踪,就像调⽤Throwable. printstacktrace()时通常会看到的那样。
F
file
输出发出⽇志记录请求的⽂件名。⽣成⽂件信息(位置信息)是⼀项昂贵的操作,可能会影响性能,请谨慎使⽤。highlight{pattern}{style}根据当前事件的⽇志级别将ANSI颜⾊添加到所包含模式的结果中。(见Jansi配置。)
l location 输出⽣成⽇志事件的调⽤者的位置信息。位置信息取决于JVM实现,但通常由调⽤⽅法的完全限定名、调⽤者源⽂件名和括号之间的⾏号组成。⽣成位置信息是⼀项昂贵的操作,可能会影响性能,请谨慎使⽤。
L
line
上⾯location功能的简略版,仅仅输出发出⽇志请求的⾏号。同样⽣成⾏号信息可能会影响性能,请谨慎使⽤。
m{nolookups}{ansi}
msg{nolookups}{ansi}
message{nolookups}
{ansi}
输出应⽤程序提供的与⽇志事件关联的消息。
M
method
输出发出⽇志请求的⽅法名。⽣成调⽤者的⽅法名(位置信息)是⼀项昂贵的操作,可能会影响性能,请谨慎使⽤。
maxLen maxLength 输出评估模式的结果并截断结果。如果长度⼤于20,则输出将包含⼀个拖尾省略号。如果提供的长度⽆效,则使⽤默认值100。⽰例语法:%maxLen{%p: %c{1} - %m%notEmpty{=>%ex{short}}}{160}将被限制为160个字符,后⾯加⼀个省略号。另⼀个例⼦:%maxLen{%m}{20}将被限制为20个字符,并且没有拖尾省略号。
n 输出平台相关的⾏分隔符字符。与使⽤不可移植的⾏分隔符字符串(如“\n”或“\r\n”)相⽐,这个转换字符提供了⼏乎相同的性能。因此,它是指定⾏分隔符的⾸选⽅法。
N
nano
在创建⽇志事件时输出System.nanoTime()的结果。
时间正则表达式java
pid{[defaultValue]}
processId{[defaultValue]}
如果底层平台⽀持,则输出进程ID。如果平台不⽀持进程id,可以指定⼀个可选的默认值来显⽰。
p
level
输出⽇志事件的级别。
r
relative
输出从JVM启动到⽇志事件创建的毫秒数。
replace{pattern}{regex} {substitution}将正则表达式'regex'的出现替换为对模式求值后字符串中的'替换'。例如,“%replace{%msg}{\s}{}”将删除事件消息中包含的所有空格。模式可以任意复杂,特别是可以包含多个转换关键字。例如,“%替换{%logger %msg}{\。}{/}将⽤正斜杠替换⽇志记录器或事件消息
中的所有点。
sn
sequenceNumber
包含将在每个事件中递增的序列号。计数器是⼀个静态变量,因此它只在共享相同转换器类对象的应⽤程序中是唯⼀的。
T
tid
threadId
输出⽣成⽇志事件的线程ID。
t
tn
thread
threadName
输出⽣成⽇志事件的线程名称。
tp
threadPriority
输出⽣成⽇志事件的线程的优先级。
fqcn输出记录器的完全限定类名。
endOfBatch输出⽇志事件的EndOfBatch状态,为“true”或“false”。
u{"RANDOM" | "TIME"} uuid 包括⼀个随机的或基于时间的UUID。基于时间的UUID是⼀个1型UUID,可以产⽣⾼达每毫秒10000独特的id,将使⽤每个主机的MAC地址,并试图确保唯⼀性跨多个jvm和/或类加载器在同⼀个主机上0到16384之间的⼀个随机数将与每个UUID⽣成类的实例相关联,包括在每⼀个基于时间的UUID⽣成。因为基于时间的uuid包含MAC地址和时间戳,所以应该⼩⼼使⽤它们,因为它们可能会导致安全漏洞。
%序列%%输出⼀个百分⽐符号。
转换字符说明
6.logger属性详解
c{precision}
logger{precision}
logger转换说明符后⾯可以跟着precision精度说明符,
后者由⼀个⼗进制整数组成,也可以是⼀个以⼗进制整数开头的模式。
当精度说明符是⼀个整数值时,它减少了记录器名称的⼤⼩。
如果数字为正,则布局将打印最右边的记录器名称组件的相应数量。
如果为负,则布局将删除最左侧记录器名称组件的相应数量。
如果精度包含任何⾮整数字符,则布局将根据模式缩写名称。
如果精度整数⼩于1,布局仍然完整打印最右边的标记。
默认情况下,布局将完整打印⽇志程序名称。
Conversion Pattern Logger Name Result
%c{1}org.apachemons.Foo Foo
%c{2}org.apachemons.Foo commons.Foo
%c{10}org.apachemons.Foo org.apachemons.Foo %c{-1}org.apachemons.Foo apachemons.Foo
%c{-2}org.apachemons.Foo commons.Foo
%c{-10}org.apachemons.Foo org.apachemons.Foo Conversion Pattern Logger Name Result
%c{1.}org.apachemons.Foo Foo
%c{1.1..}st.Foo Foo
%c{.}Foo
7.class属性详解
C{precision}
class{precision}
输出发出⽇志记录请求的调⽤者的完全限定类名。
此转换说明符可选后跟精度说明符,
它遵循与logger转换器相同的规则。
⽣成调⽤者的类名(位置信息)是⼀项昂贵的操作,
可能会影响性能,请谨慎使⽤。
所以⼀般将类名作为⽇志名称,
使⽤如下的代码记录⽇志:
private static Logger LOG = Logger(Log4j2Test.class);
配置l时使⽤logger{precision}打印⽇志程序名称,
就能打印出⽣成⽇志的调⽤者的全限定类名,
通过这种⽅法是不损害性能的。
8.date属性详解
d{pattern}
date{pattern}
输出⽇志事件的⽇期。
⽇期转换说明符后⾯可以跟⼀组⼤括号,
其中包含每个SimpleDateFormat的⽇期和时间模式字符串。
Pattern Example
%d{DEFAULT}2012-11-02 14:34:02,123
%d{DEFAULT_MICROS}2012-11-02 14:34:02,123456
%d{DEFAULT_NANOS}2012-11-02 14:34:02,123456789
%d{ISO8601}2012-11-02T14:34:02,781
%d{ISO8601_BASIC}20121102T143402,781
%d{ISO8601_OFFSET_DATE_TIME_HH}2012-11-02'T'14:34:02,781-07
%d{ISO8601_OFFSET_DATE_TIME_HHMM}2012-11-02'T'14:34:02,781-0700
%d{ISO8601_OFFSET_DATE_TIME_HHCMM}2012-11-02'T'14:34:02,781-07:00
%d{ABSOLUTE}14:34:02,781
%d{ABSOLUTE_MICROS}14:34:02,123456
%d{ABSOLUTE_NANOS}14:34:02,123456789
%d{DATE}02 Nov 2012 14:34:02,781
%d{COMPACT}20121102143402781
%d{UNIX}1351866842
%d{UNIX_MILLIS}1351866842781
Pattern Example
还可以定义⾃定义⽇期格式:
Pattern Example
%d{HH:mm:ss,SSS}14:34:02,123
%d{HH:mm:ss,nnnn} to %d{HH:mm:ss,nnnnnnnnn}14:34:02,1234 to 14:34:02,123456789 %d{dd MMM yyyy HH:mm:ss,SSS}02 Nov 2012 14:34:02,123
%d{dd MMM yyyy HH:mm:ss,nnnn} to %d{dd MMM yyyy HH:mm:ss,nnnnnnnnn}02 Nov 2012 14:34:02,1234 to 02 Nov 2012 14:34:02,123456789
%d{HH:mm:ss}{GMT+0}18:34:02
%d{UNIX}输出UNIX时间(以秒为单位),
%d{UNIX_MILLIS}以毫秒为单位输出UNIX时间。
UNIX时间是当前时间与1970年UTC年1⽉1⽇午夜之间的时间差,
UNIX以秒为单位,UNIX_MILLIS以毫秒为单位。
虽然时间单位是毫秒,但粒度取决于操作系统(Windows)。
这是输出事件时间的⼀种有效⽅法,
因为只进⾏从long到String的转换,不涉及⽇期格式。
当在Java 9上运⾏时,
Log4j 2.11增加了对时间戳timestamps的⽀持,
使得它⽐毫秒milliseconds更精确。
9.L和l属性的区别
配置l:
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%l] - %msg%n" />
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%L] - %msg%n" />
打印出对应的⽇志:
2019-10-12 15:28:25.877 [main] ERROR [org.apache.logging.log4j.Log4j2Test.logAll(Log4j2Test.java:18)] - error level log 2019-10-12 15:30:34.535 [main] ERROR [18] - error level log
10.特殊符号
有些特殊符号不能直接打印,
需要使⽤实体名称或者编号,
才能原样打印特殊字符。
特殊符号实体名称编号
&&&
<<<
>>> """

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。