logback的maven配置
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.4.4</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.4.4</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.4</version>
</dependency>
日誌框架層級
根節點: configuration
<configuration scan="true" scanPeriod="60 seconds" debug="false">
- scan : 當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
- scanPeriod : 設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
- debug : 當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態,默認值爲false。
日誌輸出組件
子節點:appender
appender用來格式化日誌輸出節點,有兩個屬性name和class,class用來指定哪種輸出策略。
總體的層級結構
- appender:定義appender填充器的名稱和類定義
- encoder:日誌格式配置定義聲明編碼格式實現類
- pattern:主要定義日誌輸出的字符串格式
- encoder:日誌格式配置定義聲明編碼格式實現類
常用就是控制檯輸出策略和文件輸出策略,如下。
ConsoleAppender-控制檯輸出器
ConsoleAppender主要的作用是將日誌信息打印到控制檯上,更加準確的說:使用System.out或者System.err方式輸出,主要子標籤有:encoder,target這兩個元素標籤,具體案例樣式如下所示。
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{"yyyy-MM-dd,HH:mm:ss,SSS"} [%X{TID}] [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設置字符集 -->
</encoder>
</appender>
最外面xml標籤(append)裏面定義了對應的append的名稱name,以及(class)對應的實際填充對象類,如下所示。
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
encoder標籤
<encoder>
:主要用於定義對應的編碼模式和編碼格式組件的聲明。<pattern>
:主要用於定義對應的該encoder下的編碼模式字符串,例如:%date{"yyyy-MM-dd,HH:mm:ss,SSS"} [%X{TID}] [%thread] %-5level %logger{36} - %msg%n
。
內部的格式字符,例如:%date等的相關的格式講解後面的章節會統一詳細的去進行介紹,大家可以根據後面的章節進行學習即可。
FileAppender-文件輸出器
用於將日誌信息輸出到文件中,主要子標籤有:appender,encoder,file,對應的層級關係爲:
- appender:日誌文件輸出appender對象
- encoder:日誌格式配置定義聲明編碼格式實現類
- file:日誌輸出路徑,代表着文件目錄加文件名稱
- encoder:日誌格式配置定義聲明編碼格式實現類
appender
同上,依然保持不變的配置模式
<appender name="file" class="ch.qos.logback.core.FileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<file>${log_dir}/logback.log</file>
</appender>
encoder標籤
<encoder>
:主要用於定義對應的編碼模式和編碼格式組件的聲明。<pattern>
:主要用於定義對應的該encoder下的編碼模式字符串,例如:%date{"yyyy-MM-dd,HH:mm:ss,SSS"} [%X{TID}] [%thread] %-5level %logger{36} - %msg%n
。
file標籤
<file>
:日誌輸出路徑,代表着文件目錄加文件名稱
<file>${log_dir}/logback.log</file>
RollingFileAppender-滾動文件輸出器
RollingFileAppender是FileAppender的子類,繼承關係。
擴展能力
如果滿足一定的條件,能夠動態的創建一個文件。然後將日誌寫入到新的文件中。
主要子標籤
file(文件全路徑),filter(過濾器),encoder(輸出格式化),rollingPolicy(滾動策略),總體的相關案例如下所示。
<appender name="errorLogFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_BASE_DIR}/log-error.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>Error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_BASE_DIR}/log-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY}</maxHistory>
<totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%date{"HH:mm:ss,SSS"} [%X{TID}] [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
其中,我們重點需要了解的是filter(過濾器)和 rollingPolicy(滾動策略)這兩個標籤對應的功能。
filter(過濾器)
過濾器主要分爲兩個常用的種類:ThresholdFilter和LevelFilter的過濾器。
系統定義的攔截器(ThresholdFilter)
過濾掉ERROR級別以下的日誌不輸出到文件中。
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
策略攔截器(LevelFilter)
使用匹配規則匹配level,按照規則進行打印,可以避免輸出 Error級別 之外的日誌
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--過濾 Error-->
<level>Error</level>
<!--匹配到就允許-->
<onMatch>ACCEPT</onMatch>
<!--沒有匹配到就禁止-->
<onMismatch>DENY</onMismatch>
</filter>
rollingPolicy(滾動策略)
盤點我們常用的策略方式主要就是一下這兩種:
TimeBasedRollingPolicy
它根據時間來制定滾動策略.時間滾動策略可以基於時間滾動按時間生成日誌,無法控制文件大小。
SizeAndTimeBasedRollingPolicy
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_BASE_DIR}/log-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY}</maxHistory>
<totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
基於大小和時間的滾動策略。這個策略出現的原因就是對時間滾動策略的一個補充,使其不僅按時間進行生成而且考慮到文件大小的原因,因爲在基於時間的滾動策略生成的日誌文件,只是對一段時間總的日誌大小做了限定,但是沒有對每個日誌文件的大小做限定,這就會造成個別日誌文件過大,後期傳遞,所以就有了這個策略。
注意:totalSizeCap屬性生效需要logback-classic依賴與logback-core依賴版本大於1.2.0,原因:ch.qos.logback.core.rolling.helper.TimeBasedArchiveRemover類存在計算溢出問題。
子節點:logger
案例配置如下。
<logger name="com.xx.XXController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
- name:用來指定受此logger約束的某一個包或者具體的某一個類。
- level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特殊值-INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那麼當前logger將會繼承上級的級別。
- addtivity:是否向上級logger傳遞打印信息。默認是true。logger最上級爲root節點
子節點: root
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
- root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性。level默認是DEBUG。
- level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置爲INHERITED或者同義詞NULL
屬性節點
定義上下文變量,name變量名稱,value爲值。
logback的容器上下文
<property name="LOG-LEVEL" value="INFO" />
... ...
<logger name="com.xx.XXController" level="${LOG-LEVEL}" additivity="false">
<appender-ref ref="console"/>
</logger>
應用springboot的環境變量
從springboot配置變量中獲取key爲source的值,name變量名稱.
<springProperty scope="context" name="LOG_FILE_MAX_SIZE" source="logging.file.max-size" defaultValue="100MB" />
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<maxFileSize>${LOG_FILE_MAX_SIZE}</maxFileSize>
</rollingPolicy>
劃分出不同的profile環境下的環境變量
<springProfile name="test">
<!-- configuration to be enabled when the "test" profile is active -->
</springProfile>
<springProfile name="dev, test">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>
<springProfile name="!prod">
<!-- configuration to be enabled when the "prod" profile is not active -->
</springProfile>
完整案例
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty scope="context" name="LOG_FILE_MAX_SIZE" source="logging.file.max-size" defaultValue="100MB" />
<springProperty scope="context" name="LOG_BASE_DIR" source="logging.file.base-path" defaultValue="/export/Logs/albert.com" />
<springProperty scope="context" name="LOG_FILE_MAX_HISTORY" source="logging.file.max-history" defaultValue="30" />
<springProperty scope="context" name="LOG_FILE_TOTAL_SIZE_CAP" source="logging.file.total-size-cap" defaultValue="20GB" />
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{TID}] %-5level %logger{36} %F:%L - %msg %ex%n"/>
<property name="LOG-LEVEL" value="INFO" />
<!--日誌輸出節點-->
<appender name="errorLogFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日誌輸出位置-->
<file>${LOG_BASE_DIR}/logfile-error.log</file>
<!--日誌級別過濾器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--過濾 Error-->
<level>Error</level>
<!--匹配到就允許-->
<onMatch>ACCEPT</onMatch>
<!--沒有匹配到就禁止-->
<onMismatch>DENY</onMismatch>
</filter>
<!--按照大小與時間的策略進行歸檔-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_BASE_DIR}/logfile-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--歸檔文件最大大小-->
<maxFileSize>${LOG_FILE_MAX_SIZE}</maxFileSize>
<!--歸檔文件存儲時長,單位天-->
<maxHistory>${LOG_FILE_MAX_HISTORY}</maxHistory>
<!--歸檔文件總大小約束-->
<totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
<encoder>
<!-- 打印日誌格式 PFTID爲pFinder的traceId -->
<pattern>${FILE_LOG_PATTERN}</pattern>
<!-- 此處設置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--日誌輸出節點-->
<appender name="defaultLogFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日誌輸出位置-->
<file>${LOG_BASE_DIR}/logfile-all.log</file>
<!--按照大小與時間的策略進行歸檔-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_BASE_DIR}/logfile-all.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!--歸檔文件最大大小-->
<maxFileSize>${LOG_FILE_MAX_SIZE}</maxFileSize>
<!--歸檔文件存儲時長,單位天-->
<maxHistory>${LOG_FILE_MAX_HISTORY}</maxHistory>
<!--歸檔文件總大小約束-->
<totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP}</totalSizeCap>
</rollingPolicy>
<encoder>
<!-- 打印日誌格式 PFTID爲pFinder的traceId -->
<pattern>${FILE_LOG_PATTERN}</pattern>
<!-- 此處設置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="${LOG-LEVEL}">
<appender-ref ref="defaultLogFile" />
<appender-ref ref="errorLogFile" />
</root>
</configuration>