一、Logback中“Pattern”由多个“Pattern分片”组成
先上一个示例:
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
对于上述示例中Pattern格式,可理解为由6个“Pattern分片”组成。
Pattern示例组成分析.jpeg
“Pattern”与“Pattern分片”说明如下:
- Logback中Pattern是由多个“Pattern分片”组成,“Pattern”分片之间由【空格】、【-】、【[]】、【普通常规字符(串)】、【无分隔符】进行连接。
- “Pattern分片”之间可以不需要任务连接字符,例如示例中的“分片5”、“分片6”
- “Pattern分片”之间若由【普通常规字符(串)】连接,需要添加其他字符(如空格),避免对“Pattern分片”中关键字造成误导,例如上图中的“分片3”与“分片4”之间若由字母“T"分割“%-5levelT%logger”,此时“分片3”会解析失败,因为系统不识别“%-5levelT”格式
二、单个“Pattern分片”组成可采拆分为7个部分
如下图所示,
pattern分片.png
- 第1部分:必须以 % 开头,%为“Pattern分片”开始标识符
- 第2部分:选填。用于表示“日志输出分片”采用左对齐还是右对齐。【+】表示右对齐,【-】表示左对齐。其中【+】可省略不写。
- 第3部分:选填。用于表示“日志输出分片”的“对齐最小字符个数”。右对齐时,“日志输出分片”字符个数不足【Num1】个数时,在左侧使用空格补齐;左对齐时,“日志输出分片”字符个数不足【Num1】个数时,在右侧使用空格补齐
- 第4部分:选填。用于表示控制“日志输出分片”字符最大个数的标识符
- 第5部分:选填。【+】用于表示“日志输出分片”字符个数超过【Num2】字符时,将“日志输出分片”从左侧截掉。【-】用于表示“日志输出分片”字符个数超过【Num2】字符时,将“日志输出分片”从右侧截掉。
- 第6部分:表示“日志输出分片”最大字符数
- 第7部分:表示“日志输出分片”取值占位码
注意事项如下:
- 第2、3为一个整体
- 第4、5、6为一个整体
三、“日志输出分片”取值占位码
-
常用“日志输出分片”取值占位码有以下几种(来至官网):
1.png
2.png
3.png
4.png
5.png
- 重要参数补充说明
- logger{length} ,length为0时,只取logger名称最后一段;length为非0的较小值时,输出logger名称的“第1段首字母+中间各阶段的首字母+最后一段全名称”;length为非0的相对较大值时,输出logger名称的“第1阶段首字母+中间阶段首字母+倒数第二段全名称+最后一段全名称”,以此类推。
- 影响运行性能的参数:C/class、L。因为这几个参数需要logback执行特殊操作获取堆栈信息才能取到值。
四、示例
- logback.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appender name="STDOUT1" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %n</pattern>
</encoder>
</appender>
<appender name="STDOUT2" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-10.-12d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<appender name="STDOUT3" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %logger{0}-%logger{1}-%logger{2}-%logger{3}-%logger{4}-%logger{5}-%logger{6}-%logger{7}-%logger{8}-%logger{9}-%logger{10} %n</pattern>
</encoder>
</appender>
<appender name="STDOUT4" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %logger{21}-%logger{22}-%logger{23}-%logger{24}-%logger{25}-%logger{26}-%logger{27}-%logger{28}-%logger{29}-%logger{30} %n</pattern>
</encoder>
</appender>
<appender name="STDOUT5" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %logger{31}-%logger{32}-%logger{33}-%logger{34}-%logger{35}-%logger{36}-%logger{37}-%logger{38}-%logger{39}-%logger{40} %n</pattern>
</encoder>
</appender>
<logger name="mytest" level="debug">
<appender-ref ref="STDOUT1"/>
<appender-ref ref="STDOUT2"/>
<appender-ref ref="STDOUT3"/>
<appender-ref ref="STDOUT4"/>
<appender-ref ref="STDOUT5"/>
</logger>
<root level="info">
</root>
</configuration>
- 代码
@RestController
public class TestController {
private static Logger log= LoggerFactory.getLogger(TestController.class);
@GetMapping("/test")
public String test(){
log.info("log-message");
return "test";
}
}
- 打印日志
2021-10-05 21:15:41
2021-10-05 2 [http-nio-8090-exec-1] INFO mytest.controller.TestController - log-message
2021-10-05 21:15:41 TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController
2021-10-05 21:15:41 m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.c.TestController-m.controller.TestController-m.controller.TestController-m.controller.TestController-m.controller.TestController
2021-10-05 21:15:41 m.controller.TestController-mytest.controller.TestController-mytest.controller.TestController-mytest.controller.TestController-mytest.controller.TestController-mytest.controller.TestController-mytest.controller.TestController-mytest.controller.TestController-mytest.controller.TestController-mytest.controller.TestController