一、常见转换符
时间与日期
%d{pattern}
:输出当前日期和时间。例如,%d{yyyy-MM-dd HH:mm:ss.SSS}
会输出2024-07-11 15:34:55.123
。
日志级别
%level
或%p
:输出日志级别,如INFO
,DEBUG
,WARN
,ERROR
。
日志信息
%msg
或%m
:输出日志消息内容。%C
或%class
:输出类的全限定名。%M
或%method
:输出方法名。%L
或%line
:输出日志的代码所在行号。%F
或%file
:输出日志的代码所在文件名。如Test.java
线程信息
%thread
或%t
:输出产生日志的线程名称。
日志记录器
%logger{length}
或%c{length}
:输出日志记录器的名称,可以指定长度。例如%logger{3}
,如果记录器的全名小于或等于指定的长度(这里是 3),则完整显示。如果超过指定长度,Logback 会从左到右缩短包名,直到整个名称的长度不超过指定值或无法进一步缩短。
进程信息
${PID}
:输出当前进程的 ID。需要代码层面System.setProperty("PID")
其他
%n
:输出一个换行符。%r
:输出自应用启动到记录该日志事件所用的毫秒数。%property{key}
:输出配置文件中的属性。如%property{os.name}
、%property{user.dir}
%ex
或%exception
:即使不配置也默认开启的。输出异常及其堆栈信息。%ex{5}
表示堆栈信息最大只输出5行%nopex
:不输出异常。%caller
:输出调用者信息,包括类名、方法名、文件名和行号。如at top.meethigher.step1.Step1.main(Step1.java:28)
正则替换
%replace(pattern){regex, replacement}
:例如%replace(%msg){'password=\w+', 'password=*****'}
二、示例格式
常用格式
跟踪 org.springframework.boot.logging.logback.DefaultLogbackConfiguration
源码,可以查看到默认的日志格式
我自己常用的日志格式如下
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %-40.40logger{39} : %msg%n%ex{5}
解析
-
%d{yyyy-MM-dd HH:mm:ss.SSS}
- 含义:日期和时间
- 格式:年-月-日 时:分:秒.毫秒
- 示例:2023-07-12 14:30:15.123
-
%5p
- 含义:日志级别,右对齐,宽度为5个字符
- 可能的值:ERROR, WARN, INFO, DEBUG, TRACE
- 示例:
INFO
-
${PID}
- 含义:进程ID
- 示例:
System.setProperty("PID","111")
-
[%15.15t]
- 含义:线程名,右对齐,最小和最大宽度为15个字符
- 示例:
[ main]
-
%-40.40logger{39}
- 含义:记录器名称,左对齐,最小和最大宽度为40个字符。表示字段的最小和最大宽度均为40个字符。如果实际内容不足40个字符,会在右侧填充空格;如果超过40个字符,会截断显示。
{39}
表示如果名称超过39个字符,将进行缩写- 示例:
com.example.MyClass
-
%msg
- 含义:日志消息内容
- 示例:Application started successfully
-
%n
- 含义:换行符
-
%ex{5}
- 含义:异常堆栈跟踪,限制为5行
配置文件
提取出一套适用于自己的 logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 参考自 https://logback.qos.ch/manual/configuration.html -->
<!-- 开启日志自动更新 -->
<configuration scan="true" scanPeriod="5 seconds">
<!-- spring官方提供的日志渲染工具 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 可以读取spring中配置 -->
<!-- <springProperty scope="context" name="test" source="proxy.name"/>-->
<!-- <property name="LOG_HOME" value="${test}"/>-->
<!-- 可以读取System.getProperty -->
<!-- <property name="LOG_HOME" value="${PID}"/>-->
<!-- 可以写死数据 -->
<property name="LOG_HOME" value="logs"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<Target>System.out</Target>
<encoder>
<!-- spring默认日志格式 -->
<pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx</pattern>
<!-- 自定义简洁格式 -->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %-40.40logger{39} : %msg%n%ex{5}</pattern>-->
<charset>utf-8</charset>
</encoder>
</appender>
<!--文件归档-->
<appender name="ARCHIVE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/latest.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd,aux}/%d{yyyy-MM-dd-HH}.log</fileNamePattern>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID} --- [%15.15t] %-40.40logger{39} : %msg%n%ex{5}</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- 减少部分日志 -->
<!-- 业务日志 -->
<!-- 此处配置优先级高于root -->
<logger name="top.meethigher.snipurl.utils.GlobalDecorator" level="DEBUG"/>
<logger name="org.hibernate" level="WARN"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ARCHIVE"/>
</root>
</configuration>
spring 中指定日志如下
logging:
#config: classpath:logback-temp.xml
config: file:logback-temp.xml
三、参考致谢
Chapter 3: Configuration