1. 程式人生 > 其它 >slf4j+logback - logback.xml配置檔案解析

slf4j+logback - logback.xml配置檔案解析

技術標籤:SpringBootslf4jlogbackspringboot日誌

前言

以前寫程式碼,不注重書寫log日誌,都是通過system.out.println來當做日誌使用。後來看了別人的程式碼,才知道日誌的重要性。一般來說,在呼叫其他地方介面之前一定要列印日誌,將傳參列印一下,便於排查問題。
即使我們不配置logback.xml,其實控制檯依然會輸出日誌(有預設的輸出方案)。我們可以通過logback.xml做一些個性化的日誌輸出,也可以定義一些輸出到檔案的日誌輸出方式等等。
寫這個部落格,主要是方便以後需要用到logback能一下找到。在此之前,搜到很多一模一樣的關於logback

的部落格,但是可能不太符合我的要求,所以我整理多家的部落格薈聚成一個xml配置檔案(相對來說,還算完整)。
本文及配置檔案有些粗糙,讀者見諒,歡迎給出建議。由於參考多個部落格(內容幾乎一樣),遂不貼原文。

logback.xml詳細配置及標籤解釋(內附列印SQL的第三種方式)

這個配置檔案,主要起標籤解釋用,裡面順帶提了三種列印SQL的方式(三種情況),其中示例的是配置檔案中所說的第三種方式(一般不使用第一種),詳情請見配置檔案。根據這個配置檔案,讀者可以自己配出一種自己需要的列印需求。
注意:不要在yml或是properties去做日誌的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 日誌級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設定為WARN,則低於WARN的資訊都不會輸出 --> <!-- configuration: scan:預設為true,當配置檔案發生改變時,將被重新載入 scanPeriod:scan為true時生效,檢測配置檔案是否有修改的時間間隔,如果沒給單位,預設毫秒。預設時間間隔1min debug:預設為false,當為true時,會列印logback內部日誌資訊,實時檢視logback執行狀態 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 以下 每個配置的 filter 是過濾掉輸出檔案裡面,會出現高級別檔案,依然出現低級別的日誌資訊,通過filter過濾只記錄本級別的日誌 --> <!--*****************************************************************************--> <!--自定義項 start--> <!--*****************************************************************************--> <!-- 定義日誌檔案的輸出位置 --> <property name="log.homeDir" value="E:/LogFiles/LogbackDemo"/> <!-- 定義專案名,作為日誌輸出位置的一項 --> <property name="log.proName" value="logbackDemo"/> <!-- 日誌檔案最大保留天數 --> <property name="log.maxHistory" value="30"/> <!-- 日誌檔案最大儲存空間 --> <property name="log.maxSize" value="3kb"/> <!-- 列印mybatis的sql語句 需要指定dao層包的位置 --> <property name="mapper.package" value="pers.liuchengyin.mapper" /> <!-- 定義日誌列印格式 - 彩色日誌 - 用於控制檯高亮 magenta:洋紅 boldMagenta:粗紅 cyan:青色 white:白色 magenta:洋紅 highlight:高亮 使用顏色需要用 %顏色名(內容),如下所示 分別是:日期 | 日誌等級 | 執行緒 | 程式碼檔案及行數 | 所在包 | 日誌資訊 --> <property name="CONSOLE_LOG_PATTERN" value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/> <!-- 輸出到檔案的日誌格式 --> <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %-5level %logger{50} - %msg%n"/> <!--*****************************************************************************--> <!--自定義項 end--> <!--*****************************************************************************--> <!-- appender: 負責寫日誌的元件 name:指定appender的名字 class:指定appender的全限定名 ch.qos.logback.core.ConsoleAppender - 控制檯輸出 ch.qos.logback.core.FileAppender - 輸出到檔案(一般不用這個輸出日誌檔案) ch.qos.logback.core.rolling.RollingFileAppender - 滾動輸出到檔案(一般採用這個輸出日誌檔案) --> <!-- ConsoleAppender 控制檯輸出日誌 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoder:負責將日誌資訊轉換成位元組陣列,然後把位元組陣列寫入到輸出流 --> <encoder> <!-- pattern:設定日誌輸出格式 --> <pattern> ${CONSOLE_LOG_PATTERN} </pattern> </encoder> <!-- 過濾器,返回一個列舉值 DENY:日誌將立即被拋棄不再經過其他過濾器 NEUTRAL:有序列表裡的下一個過濾器接著處理日誌 ACCEPT:日誌將被立即處理不再經過其他過濾器 LevelFilter - 級別過濾器,根據日誌級別進行過濾,根據onMatch和onMismatch接收或拒絕日誌(需要onMatch和onMismatch) ThresholdFilter - 臨界值過濾器,當日志級別大於等於臨界值時,過濾器返回NEUTRAL。當日志級別小於臨界值時,日誌被拒絕(僅level即可) .....其他過濾器,見官網及百度 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <!-- 後面即使logger、root裡設定了低於INFO的級別,低於INFO級別的日誌仍然會被這個過濾器過濾掉 --> <level>INFO</level> </filter> </appender> <!-- WARN級別日誌 appender --> <!-- 滾動記錄檔案,先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案 RollingFileAppender --> <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在記錄的日誌檔案的路徑及檔名,達到檔案上限則轉移到fileNamePattern配置的,可省(沒啥用) --> <file>${log.homeDir}/log_warn.log</file> <!-- 預設為true,日誌將被追加到檔案結尾。如果為false,會清空現存檔案,可省 --> <append>true</append> <!-- 為true的時候,不支援FixedWindowRollingPolicy,可省,一般不用FixedWindowRollingPolicy --> <prudent>false</prudent> <!-- 過濾器,只記錄WARN級別的日誌 --> <!-- 如果日誌級別等於配置級別,過濾器會根據onMath和onMismatch接收或拒絕日誌。 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 設定過濾級別 --> <level>WARN</level> <!-- 用於配置符合過濾條件的操作 - 立即處理 --> <onMatch>ACCEPT</onMatch> <!-- 用於配置不符合過濾條件的操作 - 丟棄 --> <onMismatch>DENY</onMismatch> </filter> <!-- 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責觸發滾動 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 日誌輸出位置 可相對、和絕對路徑 --> <fileNamePattern> <!-- 日誌輸出位置/warn/年月日/專案名-number.log number為0開始 --> ${log.homeDir}/warn/%d{yyyy-MM-dd}/${log.proName}-%i.log </fileNamePattern> <!-- 日誌檔案最大保留天數 --> <maxHistory>${log.maxHistory}</maxHistory> <!-- 日誌檔案最大的大小 --> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern> <!-- 設定日誌輸出格式 --> ${FILE_LOG_PATTERN} </pattern> </encoder> </appender> <!-- ERROR級別日誌 appender --> <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.homeDir}/error/%d{yyyy-MM-dd}/${log.proName}-%i.log</fileNamePattern> <maxHistory>${log.maxHistory}</maxHistory> <!-- 當天的日誌大小,超過MaxFileSize時,壓縮日誌並儲存 --> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender> <!-- INFO級別日誌 appender --> <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.homeDir}/info/%d{yyyy-MM-dd}/${log.proName}-%i.log</fileNamePattern> <maxHistory>${log.maxHistory}</maxHistory> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender> <!-- DEBUG級別日誌 appender --> <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.homeDir}/debug/%d{yyyy-MM-dd}/${log.proName}-%i.log</fileNamePattern> <maxHistory>${log.maxHistory}</maxHistory> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender> <!-- TRACE級別日誌 appender --> <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>TRACE</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.homeDir}/trace/%d{yyyy-MM-dd}/${log.proName}-%i.log</fileNamePattern> <maxHistory>${log.maxHistory}</maxHistory> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender> <!-- 設定一個向上傳遞的appender,所有級別的日誌都會輸出 --> <appender name="app" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>${log.homeDir}/app/%d{yyyy-MM-dd}/${log.proName}-%i.log</fileNamePattern> <maxHistory>${log.maxHistory}</maxHistory> <MaxFileSize>${log.maxSize}</MaxFileSize> </rollingPolicy> <encoder> <pattern>${FILE_LOG_PATTERN}</pattern> </encoder> </appender> <!-- logger: 用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定<appender> name:用來指定受此logger約束的某一個包或者具體的某一個類 level:用來設定日誌列印級別,大小寫無關, 如果未設定此屬性,那麼當前logger將會繼承上級的級別 additivity: 是否向上級logger傳遞列印資訊,預設是true logger可以包含0個或n個 <appender-ref> 元素,標識這個appender受這個logger約束 --> <!-- org.springframework.web包下的類的日誌輸出 --> <logger name="org.springframework.web" additivity="false" level="WARN"> <appender-ref ref="WARN"/> </logger> <!-- 使用mybatis的時候,sql語句是debug下才會列印,如果console裡配置了過濾INFO以下的,或是root里約束了INFO級別 SQL語句是不會被列印的,所以想要檢視sql語句的話,有以下三種操作: 第一種:<root level="DEBUG"> 且console不要設定過濾器。如果設定過濾器,其處理級別也要包含DEBUG級別(因為依靠Console列印SQL語句) 第二種:<root level="INFO">,console不要設定過濾器。如果設定過濾器,其處理級別也要包含DEBUG級別(因為依靠Console列印SQL語句) 單獨設定個<logger name="pers.liuchengyin.mapper" level="DEBUG" /> 第三種:console設定過濾器,且接受級別是INFO以上,這種情況無論如何,使用這個Console,DEBUG以下級別都會被過濾 單獨再創個console,設定過濾,只接受DEBUG級,然後放在logger標籤內,logger標籤這是mapper包,我這裡以第三種舉例 第三種方式實際就是:一個console負責通用列印,一個console負責專門列印SQL --> <!-- MyBatis控制檯列印 --> <appender name="MyBatis" class="ch.qos.logback.core.ConsoleAppender"> <!-- 過濾器:只打印DEBUG資訊 - 如果有兩個Console會重複列印,所以這裡只接受DEBUG級 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <!-- encoder:負責將日誌資訊轉換成位元組陣列,然後把位元組陣列寫入到輸出流 --> <encoder> <!-- pattern:設定日誌輸出格式 --> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <!-- 設定字符集 --> <charset>UTF-8</charset> </encoder> </appender> <!-- Mapper包下的資料只打印DEBUG級別 --> <logger name="pers.liuchengyin.mapper" level="DEBUG" > <appender-ref ref="MyBatis" /> </logger> <!-- root: 與logger是一樣,但其為根logger,所以命名為root,只有一個level屬性 level:預設是debug,約束所有appender-ref引入的 root可以包含0個或n個 <appender-ref> 元素,標識這個appender受這個logger約束 --> <root level="INFO"> <appender-ref ref="CONSOLE"/> <!-- 不管什麼包下的日誌都輸出到對應級別的檔案 --> <appender-ref ref="ERROR"/> <appender-ref ref="INFO"/> <appender-ref ref="WARN"/> <appender-ref ref="DEBUG"/> <appender-ref ref="TRACE"/> <appender-ref ref="app"/> </root> </configuration>

一般配置(內附配置列印SQL的第二種方式)

通常情況下,我只在控制檯列印INFO以上的日誌及MyBatis的SQL語句,不會輸出到檔案,所以我一般這麼配置。這個配置,我都是拿來就用,沒有輸出檔案的需求。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <property name="CONSOLE_LOG_PATTERN"
    value="%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"/>

    <!-- ConsoleAppender 控制檯輸出日誌 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                ${CONSOLE_LOG_PATTERN}
            </pattern>
        </encoder>
    </appender>

    <!-- Mapper包下的資料只打印DEBUG級別 -->
    <logger name="pers.liuchengyin.mapper" level="DEBUG" />

    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>

</configuration>

隨機貼個圖,可以參考一下:
呼叫的Controller
控制檯結果顯示

根據生產環境,可以在logback做如下配置

我沒區分過生產環境,所以沒有試過springProfile這個標籤能不能用,這是我之前在某部落格看到的。需要的話,可以自行配合百度,嘗試使用。

<!--生產環境:輸出到檔案-->
<springProfile name="pro">
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</springProfile>