spring cloud多模組專案框架搭建-整合SLF4J和log4j日誌元件
第七章 整合SLF4J和log4j2進行日誌管理
本系列部落格旨在搭建一套能用於實際開發使用的spring cloud多模組專案框架,並不是一個spring cloud的demo而已,提供分散式系統的開發規範限制,微服務註冊中心,配置中心,負載均衡,熔斷,redis快取,分散式事務,kafka服務訊息通訊,系統安全(sql注入攻擊,xxs攻擊等等),多資料來源切換,全域性異常處理等等。
目錄順風車:spring cloud多模組專案框架搭建:https://blog.csdn.net/lingyancangqiong/article/details/109841353
SLF4J官網:http://www.slf4j.org/
開源中國SLF4J線上API文件:https://tool.oschina.net/apidocs/apidoc?api=slf4j
log4j2官網:http://logging.apache.org/log4j/2.x/
日誌管理的重要性不用我多說了吧,還記得剛出來那會兒,沒懂起日誌的重要性,被老大一頓p,我現在公司有很多人也沒有打日誌的習慣,就連通過RPC呼叫別人系統也沒打日誌,也不知道這要呼叫失敗了怎麼扯得清楚,上線出了問題就只能乾瞪眼?這裡也告誡大家一句,必要的地方,一定要留好日誌,特別是線上只能通過日誌來複現當時的問題,但是日誌也不能亂打,日誌是通過io寫入檔案的,過量的日誌會大幅拖慢系統效能。我們這套系統採用SLF4J和log4j2作為日誌框架,並將日誌分類儲存。
一. 什麼是SLF4J?
SLF4j並不是一個具體的日誌框架,而是一個為日誌抽象層,,使用了門面設計模式和橋接,為使用者及各種log框架提供一系列統一,易用的介面。而你只需通過這一系列介面,去做具體的日誌實現,從而減少後期維護成本,不約束系統為某一種日誌形式,就拿日誌框架來說,從最初的log4j到logback,再到如今的log4j2,我想切換更高效的日誌框架時,就得去改整個系統的日誌??SLF4J很好的避免了這個問題。反之,我寫程式時也不用去管框架用的什麼日誌實現框架,怎麼去輸出日誌,只需按SLF4J的介面及格式去輸出日誌即可。
二.什麼是log4J2,為什麼要使用它??
首先我們得感謝這位大佬:Ceki Gülcü ,此處應該放一個大佬的頭像,讓我等瞻仰下,奈何百度圖片沒搜到。當今最好用的4個java日誌框架log4j,logback和本文用到的SLF4J,log4j2都是出自這位大佬之手。 Java據說起初是沒有日誌類java.util.logging ,只能System.out.println();來列印。這時候大佬就出場了,設計開發了廣為流行的log4j,並且表示sun公司可以把log4j納入jdk,但是官方表示我不比你差,自己開發了功能差不多的java.util.logging日誌工具類,但是並未影響到log4j的地位。
後來大佬又開發了logback.繼承了log4j的一些優點,重寫了核心,效能提升了10倍以上。這時候也出現了一些其他的日誌框架,大佬又發現使用者不管是從其他框架切換到log4j,logback不方便,從log4j換到logback也不方便,於是又設計開發了SLF4J,讓使用者只用按照一定的格式輸出日誌,而不用去關心切換時的影響,這和jvm的設計思想有異曲同工之妙。
2015年,Apache宣佈不再維護老年的log4j,建議使用者切換到還是這位大佬開發的log4j2,效能上比logback又提升了6到7倍。此時我覺得不能再稱為大佬,而是巨佬。
三. 整合SLF4j和log4j2
我們還是以上一章的程式碼為基礎,dream-order為例,可以照著我的講解先弄好dream-order系統,然後再自己去動手操作下dream-activity系統,這樣才記得牢,說不定還會踩上一些小坑。
1.dream系統的pom.xml引入SLF4j和log4j2的maven依賴,並排除掉spring boot預設的logback的jar包依賴,不然會產生衝突。
<properties>
<spring-boot-starter-log4j2.version>2.3.5.RELEASE</spring-boot-starter-log4j2.version>
<slf4j-log4j12.version>2.0.0-alpha1</slf4j-log4j12.version>
</properties>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot-starter.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>${spring-boot-starter-log4j2.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j-log4j12.version}</version>
<scope>test</scope>
</dependency>
2.在dream-order-web的resources下建立log4j2的配置檔案log4j2.xml ,這裡是進行日誌分類和日誌級別設定,注意其中配置的每個日誌檔案的名字,在自己動手配置dream-activity系統時一定要修改,不然就日誌錯亂了。
<?xml version="1.0" encoding="UTF-8"?>
<!--日誌級別以及優先順序排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration後面的status,這個用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 檔案和重新配置本身,設定間隔秒數-->
<configuration status="INFO" monitorInterval="30">
<!--先定義所有的appender-->
<appenders>
<!--這個輸出控制檯的配置-->
<console name="Console" target="SYSTEM_OUT">
<!--輸出日誌的格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<!--檔案會列印出所有資訊,這個log每次執行程式會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->
<File name="log" fileName="log/dream-order-test.log" append="false">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 這個會列印出所有的info及以下級別的資訊,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔-->
<RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/dream-order-info.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/dream-order-info-%d{yyyy-MM-dd}-%i.log">
<!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
<RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/dream-order-warn.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/dram-order-warn-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一資料夾下7個檔案,這裡設定了20 -->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
<RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/dream-order-error.log"
filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/dream-order-error-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
</RollingFile>
</appenders>
<!--然後定義logger,只有定義了logger並引入的appender,appender才會生效-->
<loggers>
<!--過濾掉spring和mybatis的一些無用的DEBUG資訊-->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<logger name="com.baomidou.mybatisplus" level="DEBUG"></logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
3.這樣就把SLF4j和log4j整合好了,我們啟動並列印下日誌試試,我們直接使用前面整合的lombok的註解@Slf4j的註解就可以使用log了,不用通過loggerFactory工廠去宣告。
4.可以看到控制檯日誌都完美列印了,在我們配置的碟符下看到error.log,debug.log,info.log ,至於日誌分類功能要滿足我們配置的100M才能看的到,這裡給大家看看我日常開發用的框架的產生的分類日誌,下圖中上面就是按月分類的,再進去就是按天的日誌。
本章spring cloud多模組專案框架搭建-整合SLF4J和log4j日誌元件到這裡就全部結束了,你學會了嗎?還是要多動手,光看看一會兒瞌睡都來了,自己把dream-activity整合了吧。????
本章程式碼我放在了藍奏雲,可以下載下來對照對照: (https://wws.lanzous.com/itVexirn65e 密碼:eagb)
上面所寫內容如有不足和紕漏,歡迎留言或私聊指正批評。如果需要轉載,也是歡迎,不甚榮幸,但請把《spring cloud多模組專案框架搭建》這一系列部落格全部一起轉載,這一系列部落格畢竟是個整體教程,如果別人只看到一部分,那就是個殘次品,謝謝,鞠躬。
相關文章
- Spring Boot + MyBatis 多模組專案搭建教程Spring BootMyBatis
- Android 日誌工具:專案模組較多時的救星Android
- 日誌框架SLF4J框架
- SpringBoot專案整合日誌Spring Boot
- SpringBoot - 多模組專案的搭建教程Spring Boot
- 【夯實Spring Cloud】Spring Cloud中基於maven的分散式專案框架的搭建SpringCloudMaven分散式框架
- Spring Boot整合Spring Cloud Netflix元件Spring BootCloud元件
- Java日誌框架:SLF4J詳解Java框架
- Spring Cloud微服務(一):公共模組的搭建SpringCloud微服務
- SpringBoot學習日記(二)多模組專案Spring Boot
- spring boot 多模組專案整合 mybatis 時提示找到不 Mapper 的解決方案Spring BootMyBatisAPP
- 一文讀懂常用日誌框架(Log4j、SLF4J、Logback)有啥區別框架
- 日誌模組
- Spring Boot + Maven 多模組專案開發詳解Spring BootMaven
- SpringBoot多模組專案中無法注入其他模組中的spring beanSpring BootBean
- Spring按業務模組輸出日誌到不同的檔案Spring
- Spring Boot 整合 Logback 日誌Spring Boot
- spring cloud微服務分散式雲架構 - Spring Cloud整合專案簡介SpringCloud微服務分散式架構
- springboot多模組專案搭建遇到的問題記錄Spring Boot
- Spring Boot mybatis-config 和 log4j 輸出sql 日誌Spring BootMyBatisSQL
- Spring Boot 揭祕與實戰(三) 日誌框架篇 – 如何快速整合日誌系統Spring Boot框架
- Java日誌框架:slf4j作用及其實現原理Java框架
- (三)spring cloud微服務分散式雲架構 - Spring Cloud整合專案簡介SpringCloud微服務分散式架構
- SLF4J記錄日誌&&日誌檔案的滾動策略__SpringBootSpring Boot
- 日誌SLF4J解惑
- Springboot建立maven多模組專案Spring BootMaven
- vue多專案多模組執行/打包Vue
- Spring整合log4jSpring
- 理解Spring Cloud微服務框架核心元件SpringCloud微服務框架元件
- Spring Boot整合Spring Cloud Commons進行公共元件管理Spring BootCloud元件
- OCP開源專案:日誌公共元件的實現(log-spring-boot-starter)元件Springboot
- Spring框架 - Spring和Spring框架組成Spring框架
- 日誌篇:模組日誌總體介紹
- Spring cloud 整合 SkyWalking 實現效能監控、鏈路追蹤、日誌收集SpringCloud
- Spring Boot日誌框架實踐Spring Boot框架
- 專案日誌
- springboot模組化開發專案搭建Spring Boot
- Springboot 整合logback 日誌框架簡介Spring Boot框架