本文主要整理下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 枚举类配置。 |
**注意:在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}
// 示例:%highlight{%d [%t] %-5level: %msg%n}{FATAL=white, ERROR=red, WARN=blue, INFO=black, DEBUG=green, TRACE=blue}
// 示例:%d [%t] %highlight{%-5level: %msg%n}
// 示例:%style{%d [%t]}{black} %highlight{%-5level: %msg%n}
// 示例:%highlight{%d [%t] %-5level: %msg%n}{STYLE=Logback}
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
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
// 输出
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