SpringBoot集成slf4j2日志配置的實現(xiàn)示例
簡介
本章節(jié)主要介紹springboot項目集成slf4j2,看完本章內(nèi)容可以輕松完成集成。另外說一下,在對日志輸出場景比較多的情況下可以考慮將logback更換為log4j2。
1、pom引入依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>3.1.0</version>
</dependency>
2、剔除依賴
在springboot 中默認的日志管理就是logback,需要剔除原來的日志包引用,凡是相關(guān)的springboot都需要exclusion日志包,下面舉例說明
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.7.13</version>
<exclusions><!-- 去掉springboot默認配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.13</version>
<exclusions><!-- 去掉springboot默認配置 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
3、創(chuàng)建log4j2.xml配置文件
在resource目錄下創(chuàng)建log4j2.xml文件,log4j2.xml配置詳情如下:
3.1、配置文件內(nèi)容
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,這個用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置,當設(shè)置成trace時,你會看到log4j2內(nèi)部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)-->
<configuration >
<!--日志級別以及優(yōu)先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--變量配置-->
<Properties>
<!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度 %msg:日志消息,%n是換行符-->
<!-- %logger{36} 表示 Logger 名字最長36個字符 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 定義日志存儲的路徑 -->
<property name="FILE_PATH" value="E:/logss" />
<property name="FILE_NAME" value="share" />
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--輸出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制臺只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用-->
<File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔-->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval屬性用來指定多久滾動一次,默認是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認為最多同一文件夾下7個文件開始覆蓋-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 這個會打印出所有的warn及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔-->
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval屬性用來指定多久滾動一次,默認是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認為最多同一文件夾下7個文件開始覆蓋-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 這個會打印出所有的error及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔-->
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval屬性用來指定多久滾動一次,默認是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認為最多同一文件夾下7個文件開始覆蓋-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<!--Logger節(jié)點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。-->
<!--然后定義loggers,只有定義了logger并引入的appender,appender才會生效-->
<loggers>
<!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--監(jiān)控系統(tǒng)信息-->
<!--若是additivity設(shè)為false,則 子Logger 只會在自己的appender里輸出,而不會在 父Logger 的appender里輸出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="Filelog"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
3.2、配置參數(shù)詳解
日志等級說明
| 等級 | 說明 |
|---|---|
| trace | 追蹤,就是程序推進一下,可以寫個trace輸出 |
| debug | 調(diào)試,一般作為最低級別,trace基本不用 |
| info | 輸出重要的信息,使用較多 |
| warn | 警告,有些信息不是錯誤信息,但也要給程序員一些提示。 |
| error | 錯誤信息。用的也很多 |
| fatal | 致命錯誤 |
輸出源
| 類別 | 說明 |
|---|---|
| CONSOLE | 輸出到控制臺 |
| FILE | 輸出到文件 |
格式
| 類別 | 說明 |
|---|---|
| SimpleLayout | 以簡單的形式顯示 |
| HTMLLayout | 以HTML表格顯示 |
| PatternLayout | 自定義形式顯示 |
PatternLayout自定義日志布局:
| 格式 | 說明 |
|---|---|
| %d{HH:mm:ss.SSS} | 表示輸出到毫秒的時間 |
| %t | 輸出當前線程名稱 |
| %-5level | 輸出日志級別,-5表示左對齊并且固定輸出5個字符,如果不足在右邊補0 |
| %logger | 輸出logger名稱 |
| %msg | 日志文本 |
| %n | 換行 |
| %F | 輸出所在的類文件名,如Test.java |
| %L | 輸出行號 |
| %M | 輸出所在方法名 |
| %l | 輸出語句所在的行數(shù), 包括類名、方法名、文件名、行數(shù) |
4、application.yml文件配置
需要指定加在的配置文件,因為默認加載的文件名為log4j2-spring.xml
logging:
config: classpath:log4j2.xml
level:
root: trace
5、測試
寫一段測試代碼打印日志,啟動項目進行測試即可
@Slf4j
public class Test {
@GetMapping(value = "/testFeign", produces = MediaType.APPLICATION_JSON_VALUE)
public Result<Boolean> testFeign() {
log.info("測試feign調(diào)用------biz");
return Result.success(true);
}
}
6、附錄
6.1、集成異常一
如果啟動的時候出現(xiàn)如下錯誤,則需要

SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation
解決方法:引入如下依賴即可
<!--slf4j-nop 日志開關(guān),一旦引入依賴,所有日志實現(xiàn)框架將失效-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.36</version>
</dependency>
6.2、 log4j2特性
(1)數(shù)據(jù)丟失少,可以用來做審計功能。自身內(nèi)部報的exception會被發(fā)現(xiàn),但是logback和log4j不會;
(2)log4j2使用了disruptor技術(shù),在多線程環(huán)境下,性能高于logback等10倍以上;
(3)(garbage free)之前的版本會產(chǎn)生非常多的臨時對象,會造成GC頻繁,log4j2則在這方面上做了優(yōu)化,減少產(chǎn)生臨時對象。盡可能少的GC,其實也是基于disruptor技術(shù);
(4)支持lambda表達式;
(5)對filter的功能支持的更強大;
(6)系統(tǒng)日志(Syslog)協(xié)議支持TCP 和 UDP
(7)支持kafka queue
6.3、 log4j2異步日志的四種隊列
列出了log4j2異步日志的四種隊列,有興趣可以深入了解
ArrayBlockingQueue -- 默認的隊列,通過 java 原生的 ArrayBlockingQueue 實現(xiàn)。 LinkedTransferQueue -- 通過 java7 以上原生支持的 LinkedTransferQueue 實現(xiàn)。 DisruptorBlockingQueue -- disruptor 包實現(xiàn)的高性能隊列。 JCToolsBlockingQueue -- JCTools 實現(xiàn)的無鎖隊列。
6.4 、log4j2使用了disruptor技術(shù)
Disruptor有三大殺器 CAS、消除偽共享、RingBuffer
Disruptor通過以下設(shè)計來解決隊列速度慢的問題:
環(huán)形數(shù)組結(jié)構(gòu)
為了避免垃圾回收, 采用數(shù)組而非鏈表. 同時, 數(shù)組對處理器的緩存機制更加友好。
類似的實現(xiàn)思想還有其他應(yīng)用:
| disruptor | mysql | linux 內(nèi)核 |
|---|---|---|
| RingBuffer 環(huán)形隊列實現(xiàn) | redolog通過一個環(huán)形的存儲區(qū)域?qū)崿F(xiàn)其循環(huán)寫入 | 進程間通信所使用的 fifo 通過環(huán)形存儲區(qū)域 |
元素位置定位
數(shù)組長度2^n, 通過位運算, 加快定位的速度. 下標采取遞增的形式. 不用擔心index溢出的問題. index是long類型, 即使100萬QPS的處理速度, 也需要30萬年才能用完。
無鎖設(shè)計
每個生產(chǎn)者或者消費者線程, 會先申請可以操作的元素在數(shù)組中的位置, 申請到之后, 直接在該位置寫入或者讀取數(shù)據(jù)。
到此這篇關(guān)于SpringBoot集成slf4j2日志配置的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot slf4j2日志配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Java反射的map自動裝配JavaBean工具類設(shè)計示例代碼
這篇文章主要給大家介紹了關(guān)于基于Java反射的map自動裝配JavaBean工具類設(shè)計的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面來一起看看吧2018-10-10
Java中Integer.valueOf,parsetInt() String.valueOf的區(qū)別和結(jié)果代碼解析
本文通過代碼給大家講解了JAVA中Integer.valueOf, parsetInt() String.valueOf的區(qū)別和結(jié)果,需要的朋友可以參考下2018-05-05
Java用單向環(huán)形鏈表來解決約瑟夫環(huán)Josepfu問題
如果把單鏈表的最后一個節(jié)點的指針指向鏈表頭部,而不是指向NULL,那么就構(gòu)成了一個單向循環(huán)鏈表,通俗講就是把尾節(jié)點的下一跳指向頭結(jié)點2021-10-10
SpringBoot3 spring.factories自動配置功能不生效的解決
SpringBoot3棄用spring.factories,改用AutoConfiguration.imports文件管理自動配置類,需刪除舊文件,新增專用文件并使用@AutoConfiguration替代@Configuration+@ConditionalOn組合注解,提升配置清晰度與未來擴展性2025-09-09

