spring cloud多模組專案框架搭建-整合SLF4J和log4j日誌元件

百塊富翁發表於2020-11-25

第七章  整合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多模組專案框架搭建》這一系列部落格全部一起轉載,這一系列部落格畢竟是個整體教程,如果別人只看到一部分,那就是個殘次品,謝謝,鞠躬。

相關文章