首先声明本文并不教您怎么用log4j2,仅仅只对<PatternLayout>子节点进行说明。
要看懂本文需要对log4j2有一定的了解,至少能够知道<Appenders>、<Layouts>和<Loggers>的区别。
本文主要参考对象为log4j2官方手册:《Apache Log4j 2 v. 2.1 User's Guide》,但是鉴于官方手册的不少细节描述得并不是非常清楚,甚至还有错误,所以还希望大家自己多试验,毕竟如果官方文档有错误或写得不清楚,我也没办法。
---------------------------------------------这是一条分割线,以下是正文---------------------------------------------------
PatternLayout是最重要也是最常用的控制输出内容的节点,包括类名、时间、行号、日志级别、序号等都可以控制,同时还可以指定日志格式,可以使用正则表达式处理输出结果。
PatternLayout中包含的特殊字符包括\t,\n,\r,\f,用\\输出单斜线,用%%输出%。
下面是PatternLayout的参数
Parameter Name |
Type |
Description |
charset |
String |
输出的字符集。如果没有指定,则使用系统默认的字符集输出。 |
pattern |
String |
详见后面的pattern的表格 |
replace |
RegexReplacement |
替换部分输出中的String。这将会调用一个与RegexReplacement转换器相同的函数,不同的是这是针对整个消息的。 |
alwaysWriteExceptions |
boolean |
默认为true。总是输出异常,即使没有定义异常对应的pattern,也会被附在所有pattern的最后。设为false则不会输出异常。 |
header |
String |
可选项。包含在每个日志文件的顶部。 |
footer |
String |
可选项。包含在每个日志文件的尾部。 |
noConsoleNoAnsi |
boolean |
默认为false。如果为true,且System.console()是null,则不会输出ANSI转义码。 |
下面RegexReplacement参数
Parameter Name |
Type |
Description |
regex |
String |
Java正则表达式 |
replacement |
String |
任何匹配正则规则,被正则替换的后值 |
下面是pattern属性具体描述(这个表格仅包括了我能看懂的部分,还有很多看不懂并且试验也不成功的部分我都没写。另外用于控制输出结果颜色的highlight和style我也没有写,实在是感觉平时意义不大):
参数名 |
参数意义 |
详细描述 |
||||||||||||||||||||||||
%c{参数}或%logger{参数} |
输出logger的名称,即语句private static final Logger logger = LogManager.getLogger(App.class.getName())中App.class.getName()的值。也可以使用其他字符串。 |
如果不带参数,则输出完整的logger名称;如果参数是整数n(只支持正整数),则先将logger名称依照小数点(.)分割成n段,然后取右侧的n段;如果参数不是整数,则除了最右侧的一段,其他整段字符都用这个字符代替,保留小数点;不管怎么写,最右侧的一段都保持不变。默认不带参数,并输出logger的完整名称。注意:上面的说明写得很烂,但是官方文档写得就这么烂,而且还不完整,看不懂是必然的,还请看官自己多试验,才能有所领会。如果看官自己懒得试验又看不懂,只能建议不要加参数,直接%c输出完整值。 示例:
|
||||||||||||||||||||||||
%C{参数}或%class{参数} |
输出类名。注意,这个是大写C,上面是小写c。 |
参数规则与%c完全一样,请参见上面的说明。 |
||||||||||||||||||||||||
%d{参数}{时区te{参数}{时区 |
输出时间。 |
第一个大括号数可以是保留关键字,也可以是text.SimpleDateFormat字符拼接而成。保留关键字有:DEFAULT,ABSOLUTE, COMPACT, DATE, ISO8601, ISO8601_BASIC。 第二个大括号中的参数是java.util.TimeZone.getTimeZone的值,可以设定时区。 示例:
|
||||||||||||||||||||||||
无 |
输出特殊字符 |
&, <, >, ”, ’全都要使用实体名称或实体编号替代,即
官方文档说pattern删除了\r和\n,但是经我测试可以使用,明显是官方文档的错误。 |
||||||||||||||||||||||||
%F|%file |
输出文件名 |
仅仅是文件名称,如Test.java,不包含路径名称 |
||||||||||||||||||||||||
highlight{pattern}{style} |
高亮显示结果 |
|
||||||||||||||||||||||||
%l |
输出完整的错误位置,如com.future.ourfuture.test.test.App.tt(App.java:13) |
注意1:这个是小写的L。 注意2:使用该参数会影影响日志输出的性能。 |
||||||||||||||||||||||||
%L |
输出错误行号,如“13” |
注意:使用该参数会影响日志输出的性能。 |
||||||||||||||||||||||||
%m或%msg或%message |
输出错误信息,即logger.error(String msg)中的msg |
|
||||||||||||||||||||||||
%M或%method |
输出方法名,如“main”,“getMsg”等字符串 |
|
||||||||||||||||||||||||
%n |
换行符 |
根据系统自行决定,如Windows是”\r\n”,Linux是”\n” |
||||||||||||||||||||||||
%level{参数1}{参数2}{参数3} |
参数1用来替换日志信息的级别,格式为:{level=label, level=label, …},即使用label代替的字符串替换level。其中level为日志的级别,如WARN/DEBUG/ERROR/TRACE/INFO 参数2表示只保留前n个字符。格式为length=n,n为整型。但参数1中指定了label的字符串不受此参数限制 参数3表示结果是大写还是小写。参数1指定了label的字符串不受此参数限制。 |
示例:
|
||||||||||||||||||||||||
%r或%relative |
输出自JVM启动以来到log事件开始时的毫秒数 |
|
||||||||||||||||||||||||
replace{pattern}{regex}{substitution} |
将pattern的输出结果,按照正则表达式regex匹配后,使用substitution字符串替换 |
例如:"%replace{%logger }{\.}{/}就是将所有%logger中的小数点(.)全部替换为斜杠,如果%logger是com.future.ourfuture.test.test.App则输出为com/future/ourfuture/test/test/App。pattern中可以写多个表达式,如%replace{%logger%msg%C}{\.}{/}%n |
||||||||||||||||||||||||
%sn或%sequenceNumber |
自增序号,每执行一次log事件,序号+1,是一个static变量。 |
|
||||||||||||||||||||||||
%t或%thread |
创建logging事件的线程名 |
|
||||||||||||||||||||||||
%u{RANDOM|TIME}或%uuid{RANDOM|TIME} |
依照一个随机数或当前机器的MAC和时间戳来随机生成一个UUID |
|
下面是pattern的对齐修饰:
对齐修饰,可以指定信息的输出格式,如是否左对齐,是否留空格等。
编写格式为在任何pattern和%之间加入一个小数,可以是正数,也可以是负数。如%10.20c表示对logger的信息进行处理。%-10.20m表示对message进行处理。
整数表示右对齐,负数表示左对齐;整数位表示输出信息的最小10个字符,如果输出信息不够10个字符,将用空格补齐;小数位表示输出信息的最大字符数,如果超过20个字符,则只保留最后20个字符的信息(注意:保留的是后20个字符,而不是前20个字符)。
下面是一些示例。
格式 |
是否左对齐 |
最小宽度 |
最大宽度 |
说明 |
%20 |
右对齐 |
20 |
无 |
右对齐,不足20个字符则在信息前面用空格补足,超过20个字符则保留原信息 |
%-20 |
左对齐 |
20 |
无 |
左对齐,不足20个字符则在信息后面用空格补足,超过20个字符则保留原信息 |
%.30 |
不对齐 |
无 |
30 |
如果信息超过30个字符,则只保留最后30个字符 |
%20.30 |
右对齐 |
20 |
30 |
右对齐,不足20个字符则在信息前面用空格补足,超过30个字符则只保留最后30个字符 |
%-20.30 |
左对齐 |
20 |
30 |
左对齐,不足20个字符则在信息后面用空格补足,超过30个字符则只保留最后30个字符 |