Springboot中slf4j+log4j2的使用
0.簡介
slf4j: 日志門面
log4j2: 日志實現
我要是直接用log4j2打日志當然可以,但是我想換的時候,就需要修改很多代碼.
比如說導入的日志類啊,logger的聲明啊等等.
但是我可以讓slf4j來做,slf4j是多個日志框架的上層,大家都基於slf4j來做.
這樣,要切換具體的日志框架時,只用換個依賴那些就好了, 代碼之類的不用任何修改.
這就是面向接口編程的思想,方法形參放置接口,運行時傳入不同的實現類,就能產生出不同的實現效果.
1.導入pom
<!-- log4j2依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2.排除默認的logback
默認的是logback,需要在pom中排除掉這個默認的.
此處排的是spring-boot-starter中的.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 20210714去掉logback配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
<!-- 20210714去掉logback配置 end -->
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
</exclusions>
</dependency>
如果依賴的比較細,是具體的spring-boot-starter-xx,就在這些細的依賴里面排除下,例如.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
3.編寫配置文件
放到項目的resources目錄下即可
文件名:log4j2.xml
<?xml version="1.0" encoding="utf-8"?>
<!--status:log4j包內部日志等級 600s刷新一次配置 -->
<Configuration status="WARN" monitorInterval="600">
<!-- 參數聲明 -->
<Properties>
<!-- 日志文件存放根路徑 -->
<property name="DEFAULT_LOG_ROOT_PATH" value="./"/>
<!-- 日志格式 -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} -- %style{[%t]}{bright,magenta} %highlight{%-5level}{ERROR=Bright RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} %logger{36}.%M - %msg%n"/>
<!-- 日志文件最大文件大小全局配置,單位可以為KB、MB或GB,一天之內最大文件產生數量全局配置 -->
<property name="MAX_FILE_SIZE" value="100MB"/>
<property name="MAX_FILE_NUM" value="30"/>
<!-- debug 日志文件位置及名稱,在rollFile的時候老文件的生成規則 -->
<property name="DEBUG_FILE_PATH_ING" value="${DEFAULT_LOG_ROOT_PATH}/logs/current/debug.log"/>
<!-- filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"> 備份時使用gz格式壓縮-->
<property name="DEBUG_FILE_PATH_ED" value="${DEFAULT_LOG_ROOT_PATH}/logs/history/$${date:yyyy-MM-dd}/debug-%d{yyyy-MM-dd}.%i.log"/>
<!-- info 日志文件位置及名稱,在rollFile的時候老文件的生成規則 -->
<property name="INFO_FILE_PATH_ING" value="${DEFAULT_LOG_ROOT_PATH}/logs/current/info.log"/>
<property name="INFO_FILE_PATH_ED" value="${DEFAULT_LOG_ROOT_PATH}/logs/history/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}.%i.log"/>
<!-- error 日志文件位置及名稱,在rollFile的時候老文件的生成規則 -->
<property name="ERROR_FILE_PATH_ING" value="${DEFAULT_LOG_ROOT_PATH}/logs/current/error.log"/>
<property name="ERROR_FILE_PATH_ED" value="${DEFAULT_LOG_ROOT_PATH}/logs/history/$${date:yyyy-MM-dd}/error-%d{yyyy-MM-dd}.%i.log"/>
<!-- warn 日志文件位置及名稱,在rollFile的時候老文件的生成規則 -->
<property name="WARN_FILE_PATH_ING" value="${DEFAULT_LOG_ROOT_PATH}/logs/current/warn_error.log"/>
<property name="WARN_FILE_PATH_ED" value="${DEFAULT_LOG_ROOT_PATH}/logs/history/$${date:yyyy-MM-dd}/warn_error-%d{yyyy-MM-dd}.%i.log"/>
</Properties>
<appenders>
<!-- 控制台輸出日志信息 -->
<console name="Console_Log" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</console>
<!-- debug日志文件輸出日志信息 -->
<RollingFile name="Debug_File" fileName="${DEBUG_FILE_PATH_ING}" filePattern="${DEBUG_FILE_PATH_ED}">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="${MAX_FILE_NUM}"/>
</RollingFile>
<!-- info日志文件輸出日志信息 -->
<RollingFile name="Info_File" fileName="${INFO_FILE_PATH_ING}" filePattern="${INFO_FILE_PATH_ED}">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="${MAX_FILE_NUM}"/>
</RollingFile>
<!-- warn日志文件輸出日志信息 -->
<RollingFile name="Warn_File" fileName="${ERROR_FILE_PATH_ING}" filePattern="${ERROR_FILE_PATH_ED}">
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="${MAX_FILE_NUM}"/>
</RollingFile>
<!-- error日志文件輸出日志信息 -->
<RollingFile name="Error_File" fileName="${ERROR_FILE_PATH_ING}" filePattern="${ERROR_FILE_PATH_ED}">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<SizeBasedTriggeringPolicy size="${MAX_FILE_SIZE}"/>
<TimeBasedTriggeringPolicy/>
</Policies>
<DefaultRolloverStrategy max="${MAX_FILE_NUM}"/>
</RollingFile>
</appenders>
<!--配置總的日志監聽級別-->
<loggers>
<root level="INFO">
<appender-ref ref="Console_Log"/>
<appender-ref ref="Debug_File"/>
<appender-ref ref="Info_File"/>
<appender-ref ref="Error_File"/>
</root>
</loggers>
</Configuration>
配置文件示例2
<?xml version="1.0" encoding="UTF-8" ?>
<!--
status="warn" 日志框架本身的輸出日志級別,可以修改為debug
monitorInterval="5" 自動加載配置文件的間隔時間,不低於 5秒;生產環境中修改配置文件,是熱更新,無需重啟應用
-->
<configuration status="warn" monitorInterval="5">
<!--
集中配置屬性進行管理
使用時通過:${ }
-->
<properties>
<property name="LOG_HOME">D:\ProjectFiles\1-IntelliJIDEAWorks\YangStudy\logs</property>
</properties>
<!-- 日志處理 -->
<Appenders>
<!-- 控制台輸出 appender,SYSTEM_OUT輸出黑色,SYSTEM_ERR輸出紅色 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" />
</Console>
<!-- 日志文件輸出 appender -->
<File name="file" fileName="${LOG_HOME}/myfile.log">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
</File>
<!-- 使用隨機讀寫流的日志文件輸出 appender,性能提高 -->
<RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />
</RandomAccessFile>
<!-- 按照一定規則拆分的日志文件的appender --> <!-- 拆分后的文件 -->
<!-- filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log"> -->
<RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd}-%i.log">
<!-- 日志級別過濾器 -->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
<!-- 日志消息格式 -->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %msg%n" />
<Policies>
<!-- 在系統啟動時,出發拆分規則,生產一個新的日志文件 -->
<OnStartupTriggeringPolicy />
<!-- 按照文件大小拆分,10MB -->
<SizeBasedTriggeringPolicy size="2MB" />
<!-- 按照時間節點拆分,規則根據filePattern定義的 -->
<TimeBasedTriggeringPolicy />
</Policies>
<!-- 在同一個目錄下,文件的個限定為 30個,超過進行覆蓋 -->
<DefaultRolloverStrategy max="10" />
</RollingFile>
</Appenders>
<!-- logger 定義 -->
<Loggers>
<!-- 使用 rootLogger 配置 日志級別見第5節 -->
<Root level="trace">
<!-- 指定日志使用上面哪個處理器 -->
<AppenderRef ref="Console" />
<AppenderRef ref="file" />
<AppenderRef ref="rollingFile" />
<AppenderRef ref="accessFile" />
</Root>
</Loggers>
</configuration>
4.使用
類上面加注解@Slf4j
// info
log.info("請求地址: "+ request.getRequestURI());
// 占位符的使用{}
log.info("<< | {} | 返回給調用方的響應的報文:\n {}", msgId, JSON.toJSONString(sxResponse));
// << | msgId | 返回給調用方的響應的報文:\n JSON.toJSONString(sxResponse)", msgId, JSON.toJSONString(sxResponse)
5.日志級別
通過改變配置文件中的日志級別,就能打印出不同的日志.
eg: 有的場景只是你在debug的時候看看,所以你代碼寫log.debug(),有的信息你經常想看到,所以你代碼寫log.info().
由於級別info>debug,所以在配置文件中設置級別為debug時能看到debug+info的信息,設置級別為info時就可以不看到debug的信息.
在log4j2中, 共有8個級別,按照從低到高為:
ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
- All:最低等級的,用於打開所有日志記錄.
- Trace:是追蹤,就是程序推進一下.
- Debug:指出細粒度信息事件對調試應用程序是非常有幫助的.
- Info:消息在粗粒度級別上突出強調應用程序的運行過程.
- Warn:輸出警告及warn以下級別的日志.
- Error:輸出錯誤信息日志.
- Fatal:輸出每個嚴重的錯誤事件將會導致應用程序的退出的日志.
- OFF:最高等級的,用於關閉所有日志記錄.