Log4j2的Pattern匹配

本文主要整理下Log4j2中关于Pattern的相关配置。

1. PatternLayout参数

参数名称 类型 描述
charset String 将系统日志转换为字节数组时使用的字符集。
pattern String 不能通过PatternSelector制定的一个或多个的复合pattern。
patternSelector PatternSelector 与pattern互斥的组件,用来分析LogEvent信息并确定使用哪种pattern格式化日志事件。
replace RegexReplacement 允许替换部分的结果字符串。如果配置,则必须指定要匹配的表达式和要替换的字符串。
alwaysWriteExceptions boolean 默认为true,即使pattern不包含任何的异常转换,也会始终写入异常。这表示如果在配置pattern中不包含异常输出,默认的异常输出格式将会加到pattern的结尾。设置为false,将禁用此默认行为,并支持将异常排除出输出格式中。
header String 可选标头,包含在每个日志文件的顶部。
footer Sting 可选标头,包含在每个日志文件的底部。
disableAnsi boolean 默认为false,如果配置为true,不输出ANSI转义符。
noConsoleNoAnsi boolean 默认为false,如果配置为true并且System.console()为空,不输出ANSI转义符。

其中RegexReplacement参数

参数名称 类型 描述
regex String 兼容java正则表达式的方式匹配结果字符串。
replacement String 用于替换所有匹配到的子串。

2. Pattern参数

2.1 日志转换符

2.1.1 c[logger]

转换Pattern 描述
c{precision}
logger{precision}
日志转换符后可以跟上精度说明符,其由10进制整数或10进制证书开头的Pattern组成。
当精度说明符为整数时,减少logger名称的大小,数字为正,layout将打印相应数量的最右侧logger名称,数字为负,layout将删除最左边的logger名称。
当精度说明符包含任何非整数字符,layout根据pattern缩写名称,如果精度整数小于1,layout将完整打印最右边的标识。默认情况下layout打印完整logger名称。
条件Pattern Logger名称 输出结果
%c{} com.yzy.demo.Log4j2LogTest com.yzy.demo.Log4j2LogTest
%c{1} com.yzy.demo.Log4j2LogTest Log4j2LogTest
%c{2} com.yzy.demo.Log4j2LogTest demo.Log4j2LogTest
%c{4} com.yzy.demo.Log4j2LogTest com.yzy.demo.Log4j2LogTest
%c{8} com.yzy.demo.Log4j2LogTest com.yzy.demo.Log4j2LogTest
%c{-1} com.yzy.demo.Log4j2LogTest yzy.demo.Log4j2LogTest
%c{-2} com.yzy.demo.Log4j2LogTest demo.Log4j2LogTest
%c{-4} com.yzy.demo.Log4j2LogTest com.yzy.demo.Log4j2LogTest
%c{1.} com.yzy.demo.Log4j2LogTest c.y.d.Log4j2LogTest
%c{2.} com.yzy.demo.Log4j2LogTest co.yz.de.Log4j2LogTest
%c{1.1} com.yzy.demo.Log4j2LogTest c.y.d.Log4j2LogTest
%c{1.^.~} com.yzy.demo.Log4j2LogTest c.^.~.Log4j2LogTest
%c{.} com.yzy.demo.Log4j2LogTest ...Log4j2LogTest

2.1.2 C[class]

转换Pattern 描述
c{precision}
class{precision}
输出调用日志方法的类的全限定名称,后面可以跟上精度说明符,与logger的精度说明一致。
由于此项操作影响性能,请慎用。
// 示例:%c{} %C{}
Logger logger = LogManager.getLogger("root");

// 输出:
root
com.yzy.demo.Log4j2LogTest

2.1.3 d[date]

转换Pattern 描述
d{precision}
date{precision}
输出日志的日期,日期转换符后可以跟一组大括号,每个大括号包含SimpleDateFormat的日期和时间字符串。

预定义的命名格式如下:

Pattern 示例
%d{DEFAULT} 2020-07-28 20:01:07,808
%d{DEFAULT_MICROS} 2020-07-28 20:01:07,808000
%d{DEFAULT_NANOS} 2020-07-28 20:01:07,808000000
%d{ISO8601} 2020-07-28T20:01:07,808
%d{ISO8601_BASIC} 20200728T200107,808
%d{ISO8601_OFFSET_DATE_TIME_HH} 2020-07-28T20:01:07,808+08
%d{ISO8601_OFFSET_DATE_TIME_HHMM} 2020-07-28T20:01:07,808+0800
%d{ISO8601_OFFSET_DATE_TIME_HHCMM} 2020-07-28T20:01:07,808+08:00
%d{ABSOLUTE} 20:01:07,808
%d{ABSOLUTE_MICROS} 20:01:07,808000
%d{ABSOLUTE_NANOS} 20:01:07,808000000
%d{DATE} 28 七月 2020 20:01:07,808
%d{COMPACT} 20200728200107808
%d{UNIX} 1595937667
%d{UNIX_MILLIS} 1595937667808

可以使用一组大括号包含java.util.TimeZone.getTimeZone的时区ID,没有指定日期格式说明符,则使用DEFAULT格式。

// 示例:%d{DEFAULT}\n%d{DEFAULT}{GMT+7}

// 输出
2020-07-28 20:07:21,172
2020-07-28 19:07:21,172

自定义日期格式如下:

Pattern 示例
%d{HH:mm:ss.SSS} 07:37:46.668
%d{HH:mm:ss.nnnn} - %d{HH:mm:ss.nnnnnnnnn} 07:37:46.6680 - 07:37:46.668000000
%d{yyyy-MM-dd HH:mm:ss.SSS} 2020-07-29 07:37:46.668
%d{yyyy-MM-dd HH:mm:ss.nnnn} - %d{yyyy-MM-dd HH:mm:ss.nnnnnnnnn} 2020-07-29 07:37:46.6680 - 2020-07-29 07:37:46.668000000
%d{HH:mm:ss}{GMT+0} 23:37:46

2.1.4 enc[encode]

转换Pattern 描述
enc{pattern}{[HTML|XML|JSON|CRLF]}
encode{pattern}{[HTML|XML|JSON|CRLF]}
编码和转义适合以指定语言输出的特殊字符串,如果只选择第一项,则默认HTML编码,第二项指定编码格式。
一种常见用法是对消息进行%enc{%m}编码,用户可以选择其他位置的输入,例如MDC %enc{%mdc{key}}。
Pattern 字符 替换值
HTML '\r' '\n' '\\r'和'\\n'
&, <, >, ", ', / 转换为相应的HTML内容:
& < > " ' /
XML &, <, >, ", ' 转换为相应的XML内容:
& < > " ' /
JSON
参照RFC4627
U+0000 - U+001F \u0000 - \u001F
其他的控制字符 编码为与\uABCD等效代码点
" \"
\ \\
CRLF '\r', '\n' '\\r'和'\\n'

2.1.5 equals[equalsIgnoreCase]

转换Pattern 描述
equals{pattern}{test}{substitution}
equalsIgnoreCase{pattern}{test}{substitution}
将字符串中的'test'替换为'substitution'。
// 示例:%equals{%msg}{ERROR}{123}
// 日志打印代码
logger.error("ERROR");

// 输出
123

2.1.6 ex|exception|throwable

转换Pattern 描述
ex|exception|throwable
{["none"
|"full"
|"depth"
|"short"
|"short.className"
|"short.fileName"
|"short.lineNumber"
|"short.methodName"
|"short.message"
|"short.localizedMessage"]}
{filters(package,package,...)}
{suffix(pattern)}
{separator(separator)
%默认通过Throwable.printStackTrace()完整输出Throwable日志。
可以选择增加%throwable{option}转换:
%throwable{short}输出异常日志第一行
%throwable{short.className}输出发生异常的类名
%throwable{short.methodName}输出发生异常的方法名
%throwable{short.fileName}输出发生异常的类名
%throwable{short.lineNumber}输出异常发生的行号
%throwable{short.message}输出异常信息
%throwable{short.localizedMessage}输出本地化异常信息
%throwable{n}输出异常堆栈前N行
%throwable{none}和%throwable{0}禁止异常输出
使用{filters(packages)}可以过滤异常堆栈中的特定的package信息
使用{suffix(pattern)}可以在异常堆栈信息后面追加信息
使用{separator(...)}作为行尾字符串。
// 日志打印代码
logger.error("ERROR:",e);

// 示例:%throwable{short.className}
// 输出
com.yzy.demo.MathTest
    
// 示例:%throwable{short.methodName}
// 输出
calc
    
// 示例:%throwable{short.fileName}
// 输出
MathTest.java
    
// 示例:%throwable{short.lineNumber}
// 输出

// 示例:%throwable{short.message}
// 输出
7
    
// 示例:%throwable{short.localizedMessage}
// 输出
e can't be zero
    
// 示例:%throwable{2}
// 输出
java.lang.ArithmeticException: e can't be zero
    at com.yzy.demo.MathTest.calc(MathTest.java:7)

2.1.7 F[file]

转换Pattern 描述
F
file
打印生成日志的文件名。
由于此项操作影响性能,请慎用。

2.1.8 highlight

转换Pattern 描述
highlight{pattern}{style} 基于日志级别可以设置ANSI颜色的打印日志。默认日志如下:
FATAL Bright red
ERROR Bright red
WARN Yellow
INFO Green
DEBUG Cyan
TRACE Black (looks dark grey)
颜色名称通过AnsiEscape枚举类配置。
image.png

**注意:在Eclipse中测试需要下载ANSI插件****

// 代码
logger.trace("Log4j2LogTest TRACE");
logger.debug("Log4j2LogTest DEBUG");
logger.info("Log4j2LogTest INFO");
logger.warn("Log4j2LogTest WARN");
logger.error("Log4j2LogTest ERROR");

// 配置

// 示例:%highlight{%d [%t] %-5level: %msg%n}

image-20200731173400029.png

// 示例:%highlight{%d [%t] %-5level: %msg%n}{FATAL=white, ERROR=red, WARN=blue, INFO=black, DEBUG=green, TRACE=blue}

image-20200731173251662.png

// 示例:%d [%t] %highlight{%-5level: %msg%n}

image-20200731173527730.png

// 示例:%style{%d [%t]}{black} %highlight{%-5level: %msg%n}

image-20200731173617074.png

// 示例:%highlight{%d [%t] %-5level: %msg%n}{STYLE=Logback}

image-20200803091139543.png

2.1.9 K[key]

转换Pattern 描述
K{key}
map{key}
Map{key}
输出MapMessage的entries,如%K{test}则将Map中键值与其对应的值输出,
如未指定则将使用{{key1,value1},{key2,value2}}方式输出集合全部内容。

2.1.10 l[location]

转换Pattern 描述
l
location
输出日志打印调用者的位置。由于此项操作影响性能,请慎用。

2.1.11 L[line]

转换Pattern 描述
L
line
输出生成日志的行号。
由于此项操作影响性能,请慎用。

2.1.12 m[msg/mssage]

转换Pattern 描述
m{nolookups}{ansi}
msg{nolookups}{ansi}
message{nolookups}{ansi}
输出程序打印的日志消息内容。
可以添加{ansi}进行转义打印。

// 示例:%d %style{[%t] %m}{bold,green}%n

image-20200803084708850.png

2.1.13 M[method]

转换Pattern 描述
M
method
输出请求日志打印的方法名称。
由于此项操作影响性能,请慎用。

2.1.14 marker

转换Pattern 描述
marker 打印marker的完整名称。包含其parents。

2.1.15 markerSimpleName

转换Pattern 描述
markerSimpleName 打印marker的简单名称。包含其parents。

2.1.16 maxLen/maxLength

转换Pattern 描述
maxLen{pattern}{length}
maxLength
截取输出的日志,如果长度大于20,则输出包含结尾的省略号,如果提供的长度无效,默认使用100。
// logger.info("111111111122222222223333333333444444444455555555556666666666");

// 示例:%maxLen{%c{1}-%m}{50}
// 输出:
Log4j2LogTest-111111111122222222223333333333444444...

// 示例:%maxLen{%m}{50}    
// 输出:
11111111112222222222333333333344444444445555555555...

// 示例:%maxLen{%m}{20}
// 输出:
11111111112222222222

2.1.17 n

转换Pattern 描述
n 输出换行符类似"\n", "\r\n"。

2.1.18 N

转换Pattern 描述
N
nano
输出System.nanoTime()时间。

2.1.19 pid[processId]

转换Pattern 描述
pid{[defaultValue]}
processId{[defaultValue]}
如果平台支持,则输出进程id;
如果平台不支持进程id,则可以指定显示默认值。

2.1.20 variablesNotEmpty[varsNotEmpty/notEmpty]

转换Pattern 描述
variablesNotEmpty{pattern}
varsNotEmpty{pattern}
notEmpty{pattern}
只有当pattern中所有参数不为空时,输出结果。

2.1.21 p|level

转换Pattern 描述
p|level{level=label, level=label, ...}
p|level{length=n}
p|level{lowerCase=true}
输出指定级别的日志,使用"级别=别名"展示。
// 示例:%level{INFO=info} %msg %n
// 输出
info Log4j2LogTest INFO 
WARN Log4j2LogTest WARN 
    
// 示例:%level{length=1} %msg %n
// 输出
I Log4j2LogTest INFO 
W Log4j2LogTest WARN 
    
// 示例:%level{lowerCase=true} %msg %n
// 输出    
info Log4j2LogTest INFO 
warn Log4j2LogTest WARN     

2.1.22 r[relative]

转换Pattern 描述
r
relative
输出JVM启动到日志生成时的毫秒数。

2.1.23 replace

转换Pattern 描述
replace{pattern}{regex}{substitution} 将字符串中的正则表达式regex替换为'substitution'。
// 示例:%replace{%msg}{[A-Z]{3,}}{LogLevel} %n
// 输出
Log4j2LogTest LogLevel 
Log4j2LogTest LogLevel

2.1.24 rEx|rException|rThrowable

转换Pattern 描述
rEx|rException|rThrowable
{["none"|"full"|"depth"|"short"]
[,filters(package,package,...)]
[,separator(separator)]}
{ansi(
Key=Value,Value,...
Key=Value,Value,...)}
{suffix(pattern)}
与%throwable相同,但堆栈信息打印是从第一个引发异常出打印,在加上后续的异常。
具体可以参照%throwable。

2.1.25 sn[sequenceNumber]

转换Pattern 描述
sn
sequenceNumber
在每一个日志中增加一个自增的序列号。
计数器是一个静态变量,所以对于相同的转换类是唯一的。

2.1.26 style

转换Pattern 描述
style{pattern}{ANSI style} 使用ANSI转义符设置pattern的样式。
多个样式可以使用“,”分隔。

JNSI样式:

样式名称 描述
Normal 正常
Bright 粗体
Dim 变暗或模糊
Underline 下划线
Blink 闪烁
Reverse 翻转
Hidden
Black or FG_Black 黑色
Red or FG_Red 红色
Green or FG_Green 绿色
Yellow or FG_Yellow 黄色
Blue or FG_Blue 蓝色
Magenta or FG_Magenta 洋红色
Cyan or FG_Cyan 青色
White or FG_White 白色
Default or FG_Default 默认【白色】
BG_Black 背景黑色
BG_Red 背景红色
BG_Green 背景绿色
BG_Yellow 背景黄色
BG_Blue 背景蓝色
BG_Magenta 背景洋红色
BG_Cyan 背景青色
BG_White 背景白色
// 示例:%style{%d{ISO8601}}{BG_Yellow} %style{[%t]}{blue} %style{%-5level:}{yellow} %style{%msg}{green} %n
// 输出
image-20200807084754660.png

2.1.27 T[tid/threadId]

转换Pattern 描述
T
tid
threadId
输出进程id

2.1.28 t[tn/thread/threadname]

转换Pattern 描述
t
tn
thread
threadname
输出进程名称

2.1.29 tp[threadPriority]

转换Pattern 描述
tp
threadPriority
输出进程优先级

2.1.30 fqcn

转换Pattern 描述
fqcn 输出日志器的全限定名

2.1.31 endOfBatch

转换Pattern 描述
endOfBatch 输出日志的EndOfBatch状态,true或者false

2.1.32 x[NDC]

转换Pattern 描述
x
NDC
输出与日志相关联的线程嵌套诊断上下文

2.1.33 X[mdc/MDC]

转换Pattern 描述
X{key[,key2...]}
mdc{key[,key2...]}
MDC{key[,key2...]}
输出与日志相关联的线程嵌套诊断上下文。
X转换符后面可以跟上一个或多个括号,例如%X {clientNumber},MDC中的clientNumber将输出。
如果提供了多个key的列表,如%X {name,number},则按照{name=value1,number = value2}方式输出。
如果不指定如何子项,则使用{key1=value1,key2=value2}方式顺序打印MDC中的所有键值。

2.1.34 u[uuid]

转换Pattern 描述
u{"RANDOM""TIME"}
uuid
基于随机数或时间方式生成UUID。

2.1.35 xEx|xException|xThrowable

转换Pattern 描述
xEx|xException|xThrowable
{["none"|"full"|"depth"|"short"]
[,filters(package,package,...)]
[,separator(separator)]}
{ansi(
Key=Value,Value,...
Key=Value,Value,...)}
{suffix(pattern)}
与%throwable相同,但还包含包信息。
具体可以参照%throwable。

2.2 格式修饰符

符号示例 中文说明 修饰符含义
- 减号 左对齐
20 十进制数字 最小长度
.20 句号加上十进制数字 最大长度,超过长度删除前段部分
.-20 句号加上减号加上十进制数字 最大长度,超过长度结尾截断
修饰符 左对齐 最小长度 最大长度 补充
%10msg - 10 - 长度不足10左侧补齐空格
%-10msg 10 - 长度不足10右侧补齐空格
%.10msg - - 10
%10.20msg - 10 20 长度不足10左侧补齐空格
%-10.20msg 10 20 长度不足10右侧补齐空格
%-10.-20msg 10 20 长度不足10右侧补齐空格
// 代码
logger.info("123");
logger.info("12345");
logger.info("123456789X");
logger.info("123456789X123456789X");
logger.info("123456789X123456789X123456789X");

// 输出
// [%10msg]\n]\n
[       123]
[     12345]
[123456789X]
[123456789X123456789X]
[123456789X123456789X123456789X]
         
// [%-10msg]\n
[123       ]
[12345     ]
[123456789X]
[123456789X123456789X]
[123456789X123456789X123456789X]

// [%.10msg]\n
[123]
[12345]
[123456789X]
[123456789X]
[123456789X]

// [%10.20msg]\n
[       123]
[     12345]
[123456789X]
[123456789X123456789X]
[123456789X123456789X]
           
// [%-10.20msg]\n
[123       ]
[12345     ]
[123456789X]
[123456789X123456789X]
[123456789X123456789X]
           
// [%-10.-20msg]\n
[123       ]
[12345     ]
[123456789X]
[123456789X123456789X]
[123456789X123456789X] 

3. 参考资料

Apache Log4J2官方文档地址:https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

你可能感兴趣的:(Log4j2的Pattern匹配)