slf4j+logback - logback.xml配置檔案解析
阿新 • • 發佈:2021-01-09
技術標籤:SpringBootslf4jlogbackspringboot日誌
前言
以前寫程式碼,不注重書寫log日誌,都是通過system.out.println來當做日誌使用。後來看了別人的程式碼,才知道日誌的重要性。一般來說,在呼叫其他地方介面之前一定要列印日誌,將傳參列印一下,便於排查問題。
即使我們不配置logback.xml,其實控制檯依然會輸出日誌(有預設的輸出方案)。我們可以通過logback.xml做一些個性化的日誌輸出,也可以定義一些輸出到檔案的日誌輸出方式等等。
寫這個部落格,主要是方便以後需要用到logback
能一下找到。在此之前,搜到很多一模一樣的關於logback
本文及配置檔案有些粗糙,讀者見諒,歡迎給出建議。由於參考多個部落格(內容幾乎一樣),遂不貼原文。
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>
隨機貼個圖,可以參考一下:
根據生產環境,可以在logback做如下配置
我沒區分過生產環境,所以沒有試過springProfile
這個標籤能不能用,這是我之前在某部落格看到的。需要的話,可以自行配合百度,嘗試使用。
<!--生產環境:輸出到檔案-->
<springProfile name="pro">
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>