Spring Boot Logback日志組件使用

一 logback簡介

? ? ??Logback是一個開源日志組件。Logback一般和SLF4結(jié)合起來使用。外層使用SLF4J,里面的實現(xiàn)是logback。什么意思,簡單來說我們使用層看到的是SLF4J。我們使用的時候就是和SLF4J提供的一些api打交道。

? ? ??我們可能經(jīng)常聽到SLF4J,logback,log4j,logging這些個名詞。下面我們用一個簡單的圖來解釋下他們之間的關(guān)系之間的關(guān)系。我們用一個圖來表述他們之間的關(guān)系。

log.png
  • SLF4J: Simple Logging Facade for Java 簡單日志門面,不是具體的日志解決方案,它只服務(wù)于各種各樣的日志系統(tǒng)。換句話說SLF4J只是一個日志標準(按照我們程序員的思維,我們可以把它認為是接口)。并不是日志系統(tǒng)的具體實現(xiàn)。如果項目只有slf4j的包是沒辦法實現(xiàn)日志功能的,需要配合其他的實現(xiàn)框架比如logback,logback,log4j,logging等。
  • Logback:logback框架完全按照slf4j的規(guī)范開發(fā)。是日志的具體實現(xiàn)框架。
  • log4j:log4j不是按照slf4j標準來開發(fā)的,所以log4j需要一個中間適配器。
  • logging: logging是jdk提供的一個日志框架,也不是按照slf4j標準來的,所以也需要一個總結(jié)適配器。才能兼容slf4j。

因為logback的使用不需要適配器,講道理logback比其他需要中間適配器的日志框架要快。

二 logback配置文件

? ? ??logback使用最關(guān)鍵在配置文件的使用。因為在logbakc(包括其他的日志框架)的使用過程中,有很大一部分工作都是在配置文件上做文章的,比如需要輸出什么級別的日志,日志文件怎么歸檔,打印日志文件的時候需要打印哪些信息等等。這些個東西都是通過logback的配置文件來定義的。

? ? ??logback的配置文件是一個xml格式的文件logback-test.xml或者logback.xml,讀取配置文件的步驟:

  • (1)嘗試classpath下查找文件logback-test.xml
  • (2)如果文件不存在,嘗試查找logback.xml
  • (3)如果兩個文件都不存在,LogBack用BasicConfiguration自動對自己進行最小化配置,這樣既實現(xiàn)了上面我們不需要添加任何配置就可以輸出到控制臺日志信息。

? ? ??logback配置文件是一個xml文件,根節(jié)點是configuration標簽。如下就是一個完成的logback配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<!--
   說明:
   1、日志級別及文件
       日志記錄采用分級記錄,級別與日志文件名相對應(yīng),不同級別的日志信息記錄到不同的日志文件中
       例如:error級別記錄到xxx-error-xxx.log(該文件為當前記錄的日志文件),而xxx-error-xxx.x.log為歸檔日志,
       日志文件按日期記錄,同一天內(nèi),若日志文件大小等于或大于2M,則按0、1、2...順序分別命名
       例如xxx-error-2013-12-21.0.log
       其它級別的日志也是如此。
   2、文件路徑
       若本地開發(fā),以絕對路徑指定,如:/Users/zhangboqing/Downloads/logs。
       若部署到服務(wù)器,則各個服務(wù)器約定一個固定的日志路徑如/data/home/logs/【項目名】/
   3、Appender
       FILE-ALL對應(yīng)所有級別,文件名以xxx-all-xxx.log形式命名
       FILE-ERROR對應(yīng)error級別,文件名以xxx-error-xxx.log形式命名
       FILE-WARN對應(yīng)warn級別,文件名以xxx-warn-xxx.log形式命名
       FILE-INFO對應(yīng)info級別,文件名以xxx-info-xxx.log形式命名
       FILE-DEBUG對應(yīng)debug級別,文件名以xxx-debug-xxx.log形式命名
       STDOUT將日志信息輸出到控制上,為方便開發(fā)測試使用
-->

<!--
    根節(jié)點<configuration>,包含下面三個屬性
    1.scan: 當此屬性設(shè)置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認值為true。
    2.scanPeriod: 設(shè)置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
    3.debug: 當此屬性設(shè)置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。
-->

<configuration scan="true" scanPeriod="10 seconds">

    <!--
        子節(jié)點<property name="" value=""> :用來定義變量值,它有兩個屬性name和value,通過<property>定義的值會被插入到logger上下文中,可以使“${}”來使用變量。
    -->
    <!--
        子節(jié)點<property resource=""/> :用來引入外部屬性文件,可以使“${}”來使用變量。
    -->
    <property name="APP_NAME" value="IoServer4J"/>
    <property name="LOG_DIR" value="./logs/${APP_NAME}"/>

    <property name="LOG_FILE_NAME" value="sys"/>
    <property name="ERROR_LOG_FILE_NAME" value="error"/>
    <property name="DB_LOG_FILE_NAME" value="db"/>

    <property name="logFileNamePattern" value="${LOG_FILE_NAME}_%d{yyyy-MM-dd}_%i"/>
    <property name="errorLogFileNamePattern" value="${ERROR_LOG_FILE_NAME}_%d{yyyy-MM-dd}_%i"/>
    <property name="dbLogFileNamePattern" value="${DB_LOG_FILE_NAME}_%d{yyyy-MM-dd}_%i"/>

    <!-- 注冊轉(zhuǎn)換器,顏色轉(zhuǎn)化器 -->
    <!-- 彩色日志依賴的渲染類 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <!-- 日志輸出格式 -->
    <!--
    日志輸出格式:
        %d:             表示日期時間,
        %5p:            級別從左顯示5個字符寬度,
        ${PID:- }:      pid
        %15.20t:        線程名字(如果寬度不足15,左側(cè)補空白;如果寬度超過20,從左側(cè)截斷)
        %logger{50}:    表示logger名字最長50個字符,否則按照句點分割
        %%-4L:          行號,保留后面四位字符寬度
        %m:             日志消息
        %n:             換行符
        ${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}:
-->
    <property name="consoleLayoutPattern"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.20t]){faint} %clr(%-40.40logger{60} Line:%-4L){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

    <property name="fileLayoutPattern"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:- } --- [%15.20t] %-40.40logger{60} Line:%-4L : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

    <!--
        子節(jié)點<contextName>:用來設(shè)置上下文名稱,每個logger都關(guān)聯(lián)到logger上下文,默認上下文名稱為default。但可以使用<contextName>設(shè)置成其他名字,用于區(qū)分不同應(yīng)用程序的記錄。一旦設(shè)置,不能修改。
    -->
    <contextName>${APP_NAME}</contextName>

    <!--
        子節(jié)點<appender>:負責(zé)寫日志的組件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名
        class為ch.qos.logback.core.ConsoleAppender 把日志輸出到控制臺
        class為ch.qos.logback.core.FileAppender 把日志添加到文件
        class為ch.qos.logback.core.rolling.RollingFileAppender 滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件
    -->

    <!-- 控制臺輸出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${consoleLayoutPattern}</pattern>
        </encoder>
    </appender>

    <appender name="SYS_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/${LOG_FILE_NAME}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/${logFileNamePattern}.log.zip
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${fileLayoutPattern}</pattern>
        </encoder>
    </appender>

    <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/${ERROR_LOG_FILE_NAME}.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.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/${errorLogFileNamePattern}.log.zip
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory><!-- days -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${fileLayoutPattern}</pattern>
        </encoder>
    </appender>

    <appender name="DB_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/${DB_LOG_FILE_NAME}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/${dbLogFileNamePattern}.log.zip
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory><!-- days -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${fileLayoutPattern}</pattern>
        </encoder>
    </appender>

    <!--
        子節(jié)點<logger>:用來設(shè)置某一個包或者具體的某一個類的日志打印級別,以及指定<appender>,
        logger 僅有一個name屬性,兩個可選屬性 level/additivity
            name:用來指定受此logger約束的某一個包或者具體的某一個類。
            level:用來設(shè)置打印級別,大小寫無關(guān),TRACE,DEBUG,INFO,WARE,ERROR,ALL和OFF,還有一個特俗值INHERITED
                    或者 同義詞NULL,代表強制執(zhí)行上級的級別。
            additivity:是否向上級logger傳遞打印信息。默認是true。
    -->

    <!-- db/sql logger -->
    <logger name="java.sql.Connection" level="warn" additivity="true">
        <appender-ref ref="DB_LOG"/>
    </logger>
    <logger name="java.sql.PreparedStatement" level="warn" additivity="true">
        <appender-ref ref="DB_LOG"/>
    </logger>
    <logger name="java.sql.Statement" level="warn" additivity="true">
        <appender-ref ref="DB_LOG"/>
    </logger>

    <!-- sql -->
    <logger name="com.pilot.ioserver.basic.biz.pbl.core.db.mapper" level="warn" additivity="true">
        <appender-ref ref="DB_LOG"/>
    </logger>

    <!-- 生產(chǎn)環(huán)境下,將此級別配置為適合的級別,以免日志文件太多或影響程序性能 -->
    <!--
        <root>元素也是<logger>元素,logger。只有一個level屬性。
        root 元素配置根 logger。該元素有一個 level 屬性。沒有 name 屬性,因為已經(jīng)被命名為“root”
        <root>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。
    -->
    <root level="warn">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
        <!-- 文件輸出 -->
        <appender-ref ref="SYS_LOG"/>
        <!-- 錯誤日志 -->
        <appender-ref ref="ERROR_LOG"/>
    </root>
</configuration>

2.1 configuration

? ? ??configuration標簽是logback文件的根目錄。

2.1.1 configuration屬性

configuration屬性 默認值 解釋
scan true 當設(shè)置為true時,如果配置文件發(fā)生改變,將會被重新加載
scanPeriod 1分鐘 默認單位是毫秒,當scan為true時,此屬性生效。作用:檢測配置文件是否有修改時間間隔
debug false 當此屬性為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!--其他配置省略-->
</configuration>

? ? ??上述配置代碼每隔60毫秒會檢查logback配置文件是否有修改,如果有修改就重寫加載。并且不會輸出logback的內(nèi)部日志。

2.1.2 configuration子節(jié)點

configuration子節(jié)點 含義
contextName 設(shè)置日志上下文名稱,后面輸出格式中可以通過定義 %contextName 來打印日志上下文名稱
property 用來設(shè)置相關(guān)變量,通過key-value的方式配置,然后在后面的配置文件中通過 ${key}來訪問
timestamp 用于獲取時間戳字符串
conversionRule 注冊轉(zhuǎn)換器,顏色轉(zhuǎn)化器
appender 負責(zé)寫日志的組件,主要負責(zé)日志的輸出以及格式化日志
logger 用來設(shè)置某一個包或者具體的某一個類的日志輸出級別,以及指定<appender>
root 用來指定最基礎(chǔ)的日志輸出級別
filter 通過使用該標簽指定過濾策略
encoder 使用該標簽下的標簽指定日志輸出格式
rollingPolicy 指定收集策略,比如基于時間進行收集

2.2 contextName

? ? ??contextName標簽用于設(shè)置日志上下文名稱,后面輸出格式中可以通過定義%contextName來打印日志上下文名稱。每個logger都關(guān)聯(lián)到logger上下文,默認上下文名稱為default。可以使用<contextName>設(shè)置成其他名字,用于區(qū)分不同的應(yīng)用程序的記錄。一旦設(shè)置,不能修改。

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>myAppName</contextName>
    <!--其他配置省略-->
</configuration>

2.3 property

? ? ??property標簽用來設(shè)置相關(guān)變量,通過key-value的方式配置,然后在后面的配置文件中通過 ${key}來訪問。

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <property name="APP_Name" value="myAppName"></property>
    <contextName>${APP_Name}</contextName>
    <!--其他配置省略-->
</configuration>

2.4 timestamp

? ? ??timestamp標簽用于獲取時間戳字符串,有兩個屬性key和datePattern。

timestamp屬性 解釋
key 標識此<timestamp>的名字
datePattern 設(shè)置將當前時間(即解析配置文件的時間)轉(zhuǎn)換為字符串,遵循java.txt.SimpleDateFormat的格式
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <timestamp key="bySecond"datePattern="yyyyMMdd'T'HHmmss"></timestamp>
    <contextName>${bySecond}</contextName>
</configuration>

2.5 appender

? ? ??appender標簽負責(zé)主要負責(zé)日志的輸出以及格式化日志。當一個日志記錄被觸發(fā)的時候,logback會根據(jù)我們的配置信息把這個事件交給appender處理。appender有兩個必要屬性name和class。

appender屬性

appender屬性 解釋
name 指定appender名稱
class 指定appender的全限定名

? ? ??append屬性class設(shè)置的不同,append子節(jié)點也不同,所以這里我們直接看appender對應(yīng)的class類型有哪些。

appender class 類型

appender類型 class全限定名 解釋
ConsoleAppender ch.qos.logback.core.ConsoleAppender 把日志輸出到控制臺
FileAppender ch.qos.logback.core.FileAppender 把日志輸出到文件
RollingFileAppender ch.qos.logback.core.rolling.RollingFileAppender 滾動記錄文件,先將日志文件指定到文件,當符合某個條件是,將日志記錄到其他文件
SocketAppender ch.qos.logback.classic.net.SocketAppender 輸出日志到遠程實例中,明文
SSLSocketAppender ch.qos.logback.classic.net.SSLSocketAppender 輸出日志到遠程實例中,加密
SMTPAppender ch.qos.logback.classic.net.SMTPAppender 將日志以郵件的形式發(fā)出
DBAppender ch.qos.logback.classic.db.DBAppender 將日志保存在數(shù)據(jù)庫中
SyslogAppender ch.qos.logback.classic.net.SyslogAppender 將日志發(fā)送給遠程的receiver
SiftingAppender ch.qos.logback.classic.sift.SiftingAppender SiftingAppender提供過濾篩選日志的功能。你可以通過用戶的sessions的數(shù)據(jù)來篩選日志,然后分發(fā)到不同日志文件
AsyncAppender ch.qos.logback.classic.AsyncAppender 記錄ILoggingEvents的方式是異步的。它僅僅相當于一個event分配器,因此需要配合其他appender才能有所作為

? ? ??ConsoleAppender、FileAppender、RollingFileAppender。這幾個appender是最常用的,我們對他們的使用做一個簡單的介紹。

2.5.1 ConsoleAppender

? ? ??ConsoleAppender用于把日志輸出到控制臺。

? ? ??如下配置會把DEBUG級別的日志輸出到控制臺。

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

? ? ??ConsoleAppender節(jié)點介紹。

ConsoleAppender子節(jié)點 解釋
encoder 對日志進行格式化
target 字符串System.out(默認)或者System.err
filter 對某些日志做過濾

2.5.2 FileAppender

? ? ??FileAppender用于把日志添加到文件。

? ? ??比如如下的配置會把DEBUG級別的日志輸出到log-${bySecond}.txt文件。

<configuration>

  <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
       the key "bySecond" into the logger context. This value will be
       available to all subsequent configuration elements. -->
  <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <!-- use the previously created timestamp to create a uniquely
         named log file -->
    <file>log-${bySecond}.txt</file>
    <encoder>
      <pattern>%logger{35} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

? ? ??FileAppender節(jié)點介紹。

FileAppender子節(jié)點 解釋
file 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值
append 默認為true。如果是true,日志被追加到文件結(jié)尾,如果是false,清空現(xiàn)存文件
encoder 對記錄事件進行格式化
prudent 默認為false。如果是true,日志會被安全的寫入文件,即其他的FileAppender也在向此文件做寫入操作,效率低
filter 對某些日志做過濾

2.5.3 RollingFileAppender

? ? ??RollingFileAppender是對FileAppender的一個擴展。相較于它的父類,它的主要作用是滾動記錄日志。先將日志文件指定到文件,當符合某個條件時,將日志記錄到其他文件。所以這里有兩個重要的點,一是什么時候滾動(觸發(fā)triggeringPolicy)、二是發(fā)生滾動的時候怎么去保存文件(動作,策略rollingPolicy)。

? ? ??RollingFileAppender節(jié)點介紹。

RollingFileAppender子節(jié)點

RollingFileAppender子節(jié)點 解釋
file 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值,就說說日志會先保存在這個文件里面
append 默認為true。如果是true,日志被追加到文件結(jié)尾,如果是false,清空現(xiàn)存文件
encoder 對記錄事件進行格式化
rollingPolicy 發(fā)送滾動是,RollingFileAppender的行為。例如日志文件名的修改
triggeringPolicy 決定什么時候發(fā)送日志滾動,例如日期,日志文件大小到達一定值
prudent 當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1不支持也不允許文件壓縮,2不能設(shè)置file屬性,必須留空
filter 對某些日志做過濾

2.5.3.1 rollingPolicy介紹

? ? ??rollingPolicy節(jié)點用于定義當發(fā)生日志切換時(發(fā)生日志滾動是),RollingFileAppender的切換行為。例如日志文件名的修改。(RollingPolicy實際上就是負責(zé)日志文件的切換以及重命名的)。logback里面已經(jīng)給我們提供個多種切換的實現(xiàn)類。下面我們對這些實現(xiàn)類做一個簡單的介紹。

rollingPolicy類型 解釋
TimeBasedRollingPolicy 是最受歡迎的日志滾動策略。它的滾動策略是基于時間的,例如根據(jù)天數(shù),月份
SizeAndTimeBasedRollingPolicy 有時候你不僅想通過時間來規(guī)定滾動策略,還希望同時限制每個日志文件的大小。在TimeBasedRoolingPolicy中已經(jīng)提供限制總?cè)罩疚募拇笮〉墓δ埽鳶izeAndTimeBasedRollingPolicy提供了更為強大的,針對單個日志文件的大小限制能力
FixedWindowRollingPolicy 固定窗口的日志滾動策略
2.5.3.1.1 TimeBasedRollingPolicy

? ? ??是最受歡迎的日志滾動策略。它的滾動策略是基于時間的。根據(jù)時間觸發(fā)滾動(fileNamePattern屬性會解析到),同時可以設(shè)置保留的文件的最大大小(超過最大大小就會把之前的覆蓋掉),以及最大保留的粒度(如果是觸發(fā)保存是按天來的,可以設(shè)置最大保留多少天的日志。如果是月,可以設(shè)置最多保留多少月等等)。

注意,TimeBasedRollingPolicy已經(jīng)包含了triggeringPolicy節(jié)點的功能。所以設(shè)置了rollingPolicy為TimeBasedRollingPolicy就不需要在設(shè)置triggeringPolicy了。

? ? ??比如如下的配置,會每天保存一個日志文件,并且最大保存30天的日志,同時限制所以日志文件的最大大小為3G。

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logFile.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- daily rollover -->
      <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>

      <!-- keep 30 days' worth of history capped at 3GB total size -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>

    </rollingPolicy>

    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender> 

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

? ? ??TimeBasedRollingPolicy屬性介紹。

TimeBasedRollingPolicy屬性 類型 解釋
fileNamePattern String 必要節(jié)點,包含文件名及"%d"轉(zhuǎn)換符,"%d"可以包含一個java.text.SimpleDateFormat指定的時間格式,默認格式是yyyy-MM-dd。也可以設(shè)置其他格式,如:%d{yyyy-MM}
maxHistory int 可選參數(shù),聲明歸檔日志最大保留時間。如果你是基于月份的日志滾動,則當maxHisory為6時,說明會保留6個月的日志。大于6個月的就會被刪除。日志所存在的目錄也會被合適的刪除掉
totalSizeCap String 可選參數(shù),聲明歸檔日志的最大存儲量。當超過這個值,最老的歸檔日志文件也會被刪除
cleanHistoryOnStart boolean 可選參數(shù),聲明歸檔日志的最大存儲量。當超過這個值,最老的歸檔日志文件也會被刪除 可選參數(shù),默認為false,如果設(shè)置為true,則當appender啟動時,會刪除所有歸檔日志文件

舊版本的logback里可以在TimeBasedRollingPolicy這個rollingPolicy下配置一個timeBasedFileNamingAndTriggeringPolicy(實現(xiàn)類為SizeAndTimeBasedFNATP)達到同時配置時間和文件大小的滾動策略;而在新版本里可以使用SizeAndTimeBasedRollingPolicy替代。

2.5.3.1.2 SizeAndTimeBasedRollingPolicy

? ? ??有時候你不僅想通過時間來規(guī)定滾動策略,還希望同時限制每個日志文件的大小。在TimeBasedRoolingPolicy中已經(jīng)提供限制總?cè)罩疚募拇笮〉墓δ埽鳶izeAndTimeBasedRollingPolicy提供了更為強大的針對單個日志文件的大小限制能力。

? ? ??比如如下的配置,按天觸發(fā)日志的保存,同時限制了單個文件的大小。所以每天可能有多個日志文件。關(guān)于fileNamePattern的使用我們會在下文中講到。

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>


  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>

? ? ??SizeAndTimeBasedRollingPolicy屬性介紹,SizeAndTimeBasedRollingPolicy繼承TimeBasedRollingPolicy就額外的多一個屬性maxFileSize

SizeAndTimeBasedRollingPolicy屬性 類型 解釋
fileNamePattern String 必要節(jié)點,包含文件名及"%d"轉(zhuǎn)換符,"%d"可以包含一個java.text.SimpleDateFormat指定的時間格式,默認格式是yyyy-MM-dd。也可以設(shè)置其他格式,如:%d{yyyy-MM}
maxHistory int 可選參數(shù),聲明歸檔日志最大保留時間。如果你是基于月份的日志滾動,則當maxHisory為6時,說明會保留6個月的日志。大于6個月的就會被刪除。日志所存在的目錄也會被合適的刪除掉
totalSizeCap String 可選參數(shù),聲明歸檔日志的最大存儲量。當超過這個值,最老的歸檔日志文件也會被刪除
cleanHistoryOnStart boolean 可選參數(shù),聲明歸檔日志的最大存儲量。當超過這個值,最老的歸檔日志文件也會被刪除 可選參數(shù),默認為false,如果設(shè)置為true,則當appender啟動時,會刪除所有歸檔日志文件
maxFileSize String 限定單個日志文件的大小
2.5.3.1.3 FixedWindowRollingPolicy

? ? ??基于窗口大小的滾動策略。這個聽起來可能有點難理解,其實說白了就是將歸檔日志文件到最大了就寫到下一個文件里,而窗口大小就是最多允許多少份日志文件。要特別注意FixedWindowRollingPolicy是沒有告知什么時候觸發(fā)日志的保存的。所以FixedWindowRollingPolicy的使用需要配合triggeringPolicy標簽一起使用,而且一般triggeringPolicy標簽會設(shè)置SizeBasedTriggeringPolicy。

? ? ??比如如下的配置,保存DEBUG級別的日志,并且每5MB保存一個文件,窗口大小是1到3,當保存了3個歸檔文件后,將覆蓋最早的日志。

<configuration>
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>test.log</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>tests.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>

    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
        
  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>

? ? ??FixedWindowRollingPolicy屬性屬性介紹。

FixedWindowRollingPolicy屬性 類型 解釋
minIndex int 這個參數(shù)指定窗口索引的最小值
maxIndex int 這個參數(shù)指定窗口索引的最大值
fileNamePattern String 這個參數(shù)與之前的fileNamePattern沒什么差別,唯一需要注意的是必須包含%i標識符,這個標識符的作用是指明當前窗口索引的值。例如將fileNamePattern設(shè)置成 "MyLogFile%i ",minIndex為1,maxIndex為3,則會創(chuàng)建MyLogFile1.log, MyLogFile2.log and MyLogFile3.log.這三個歸檔日志文件。

特別要注意,如果rollingPolicy標簽設(shè)置為FixedWindowRollingPolicy。一定要設(shè)置triggeringPolicy標簽的內(nèi)容。要不然是沒辦法觸發(fā)保存日志的。

2.5.3.2 triggeringPolicy介紹

? ? ??triggeringPolicy標簽設(shè)置的值用于告知RollingFileAppender什么時候觸發(fā)滾動操作。上面rollingPolicy介紹的各種rollingPolicy類型里面,其實TimeBasedRollingPolicy和SizeAndTimeBasedRollingPolicy已經(jīng)包含了triggeringPolicy的功能(會通過fileNamePattern屬性解析出來),只有FixedWindowRollingPolicy是沒有triggeringPolicy功能的,所以FixedWindowRollingPolicy要設(shè)置triggeringPolicy。一般都是設(shè)置SizeBasedTriggeringPolicy。

? ? ??SizeBasedTriggeringPolicy只有一個屬性,就是文件大小。當?shù)竭_了設(shè)置的大小的時候RollingFileAppender就觸發(fā)一次滾動操作。

SizeBasedTriggeringPolicy屬性 類型 解釋
maxFileSize String 默認10MB, 當?shù)竭_這個容量,就開啟日志滾動

2.6 filter

? ? ??logback的過濾器可以過濾記錄日志的內(nèi)容,執(zhí)行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。從而將不符合條件的日志信息過濾掉。

  • DENY: 日志將立即被拋棄不再經(jīng)過其他過濾器。
  • NEUTRAL: 有序列表里的下個過濾器過接著處理日志。
  • ACCEPT: 日志會被立即處理,不再經(jīng)過剩余過濾器。

? ? ??過濾器被添加到<Appender>中,為<Appender>添加一個或多個過濾器后,可以用任意條件對日志進行過濾。<Appender>有多個過濾器時,按照配置順序執(zhí)行。

? ? ??關(guān)于Filter的實現(xiàn)類有多種,這里我們主要講兩種:LevelFilter以及ThresholdFilter.

2.6.1 LevelFilter

? ? ??級別過濾器,根據(jù)日志級別進行過濾。如果日志級別等于配置級別,過濾器會根據(jù)onMath 和 onMismatch接收或拒絕日志。

LevelFilter子節(jié)點 解釋
level 設(shè)置過濾級別
onMatch 用于配置符合過濾條件的操作
onMismatch 用于配置不符合過濾條件的操作

? ? ??比如以下的配置,只接受ERROR級別的日志,非ERROR級別的日志都會被過濾掉。

    <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/${ERROR_LOG_FILE_NAME}.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.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/${errorLogFileNamePattern}.log.zip
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory><!-- days -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${fileLayoutPattern}</pattern>
        </encoder>
    </appender>

2.6.2 ThresholdFilter

? ? ??臨界值過濾器,過濾掉低于指定臨界值的日志。ThresholdFilter只有一個level子節(jié)點可以設(shè)置。當日志級別等于或高于臨界值時,過濾器返回NEUTRAL;當日志級別低于臨界值時,日志會被拒絕。

? ? ??比如如下的配置,過濾掉TRACE和DEBUG級別的日志。

    <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/${ERROR_LOG_FILE_NAME}.log</file>
        <!-- 過濾掉 TRACE 和 DEBUG 級別的日志-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/${errorLogFileNamePattern}.log.zip
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory><!-- days -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${fileLayoutPattern}</pattern>
        </encoder>
    </appender>

2.6.3 EvaluatorFilter

? ? ??求值過濾器,評估、鑒別日志是否符合指定條件。需要額外的兩個JAR包,commons-compiler.jar和janino.jar。

EvaluatorFilter子節(jié)點 解釋
evaluator 鑒別器,常用的鑒別器是JaninoEventEvaluato,也是默認的鑒別器,它以任意的java布爾值表達式作為求值條件,求值條件在配置文件解釋過成功被動態(tài)編譯,布爾值表達式返回true就表示符合過濾條件。evaluator有個子標簽<expression>,用于配置求值條件
onMatch 用于配置符合過濾條件的操作
onMismatch 用于配置不符合過濾條件的操作

? ? ??這里注意下evaluator子節(jié)點的使用,。evaluator有個子標簽<expression>,用于配置求值條件。求值表達式作用于當前日志,logback向求值表達式暴露日志的各種字段如下:

expression可以使用字段 類型 含義
event LoggingEvent 與記錄請求相關(guān)聯(lián)的原始記錄事件,下面所有變量都來自event,例如,event.getMessage()返回下面"message"相同的字符串
message String 日志的原始消息,例如,設(shè)有l(wèi)ogger mylogger,"name"的值是"AUB",對于 mylogger.info("Hello {}",name); "Hello {}"就是原始消息。
formatedMessage String 日志被各式話的消息,例如,設(shè)有l(wèi)ogger mylogger,"name"的值是"AUB",對于 mylogger.info("Hello {}",name); "Hello Aub"就是格式化后的消息。
logger String logger 名。
loggerContext LoggerContextVO 日志所屬的logger上下文。
level int 級別對應(yīng)的整數(shù)值,所以 level > INFO 是正確的表達式。
timeStamp long 創(chuàng)建日志的時間戳。
marker Marker 與日志請求相關(guān)聯(lián)的Marker對象,注意“Marker”有可能為null,所以你要確保它不能是null
mdc Map 包含創(chuàng)建日志期間的MDC所有值得map。訪問方法是:mdc.get("myKey") 。mdc.get()返回的是Object不是String,要想調(diào)用String的方法就要強轉(zhuǎn),例如,((String) mdc.get("k")).contains("val") .MDC可能為null,調(diào)用時注意。
throwable java.lang.Throwable 如果沒有異常與日志關(guān)聯(lián)"throwable" 變量為 null. 不幸的是, "throwable" 不能被序列化。在遠程系統(tǒng)上永遠為null,對于與位置無關(guān)的表達式請使用下面的變量throwableProxy
throwableProxy IThrowableProxy 與日志事件關(guān)聯(lián)的異常代理。如果沒有異常與日志事件關(guān)聯(lián),則變量"throwableProxy" 為 null. 當異常被關(guān)聯(lián)到日志事件時,"throwableProxy" 在遠程系統(tǒng)上不會為null

? ? ??比如如下的配置,過濾掉所有日志消息中不包含“billing”字符串的日志。

    <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/${ERROR_LOG_FILE_NAME}.log</file>
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator> <!-- 默認為 ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
                <expression>return message.contains("billing");</expression>
            </evaluator>
            <OnMatch>ACCEPT </OnMatch>
            <OnMismatch>DENY</OnMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/${errorLogFileNamePattern}.log.zip
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory><!-- days -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>UTF-8</charset>
            <pattern>${fileLayoutPattern}</pattern>
        </encoder>
    </appender>

2.7 logger,root

2.7.1 logger

? ? ??用來設(shè)置某一個包或者具體某一個類的日志打印級別,以及指定<appender>。什么意思。

logger屬性 解釋
name 用來指定受此loger約束的某一個包或者具體的某一個類
level 用來設(shè)置打印級別,大小寫無關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執(zhí)行上級的級別。如果未設(shè)置此屬性,那么當前l(fā)oger將會繼承上級(root標簽)的級別
addtivity 是否向上級loger傳遞打印信息。默認是true

? ? ??關(guān)于addtivity。如果addtivity設(shè)置為true,那么當前l(fā)ogger標簽作用完之后,logger標簽對應(yīng)類或者包的父類,繼續(xù)作用一直到root標簽。如果addtivity設(shè)置為false,那么當前l(fā)ogger標簽作用完之后就直接掐斷了,不在繼續(xù)往上走了。

? ? ??<loger>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個loger。<appender-ref>標簽就是去指定日志的相應(yīng)操作,不管是控制臺輸出,還是保存到文件,還是滾動日志輸出啥的。

2.7.2 root

? ? ??<root>也是<loger>元素,但是它是根loger。只有一個level屬性。用來設(shè)置打印級別。

root是不用指定包或者類的,我們可以簡單的認為root指定了所有的包.

? ? ??這里要重點說下logger和root的關(guān)系。怕有些同學(xué)搞混掉.我們通過幾個例子來說明。

2.7.3 root,logger關(guān)系

? ? ??關(guān)于root和logger之間的關(guān)系要重點講下。當root和logger同時存在的時候。要特別注意logger和root標簽兩者最終的level;和logger標簽是否設(shè)置了向上傳遞的屬性。

  • logger沒有設(shè)置level,那么logger直接繼承root的level(如果有多個logger并且logger直接有上下級關(guān)系的話,就一層一層往上)。
  • logger設(shè)置了level,同時如果logger設(shè)置了向上傳遞的話(additivity="true")。那么root標簽和logger相同的包也使用logger的level。

2.7.3.1 情況一

    <logger name="com.tuacy.logback"/>

    <root level="info">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>

? ? ??因為logger沒有設(shè)置等級,直接繼承root的等級.addtivity默認就是true向上傳遞.可以認為當com.tuacy.logback包里面某個類打印日志的時候使用的配置為.

    <logger name="com.tuacy.logback" level="info" additivity="true"/>

    <root level="info">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>

? ? ??logger沒有設(shè)置appender-ref所以logger沒啥用,不打印,這個時候只有root設(shè)置起作用,com.tuacy.logback包下面的類info,warn,error的日志都會打印出來。

2.7.3.2 情況二

    <logger name="com.tuacy.logback" additivity="false"/>

    <root level="info">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>

? ? ??logger沒有設(shè)置等級,繼承root的等級,additivity為false,不往上傳遞,root不作用。配置相當于

    <logger name="com.tuacy.logback" additivity="false"/>

? ? ??如果這個時候有com.tuacy.logback包或者子包有打印的時候,不會有任何打印信息。

2.7.3.3 情況三

    <logger name="com.tuacy.logback" level="error"/>

    <root level="info">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>

? ? ??logger和root都有設(shè)置等級取兩者等級較高的。所以上述配置等價于

    <logger name="com.tuacy.logback" level="error" additivity="true"/>

    <root level="error">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>

? ? ??這個時候只有error級別的信息會打印出來,root也使用logger的level。注意,只是針對com.tuacy.logback包和他的子包root的等級改變了。其他的包root還是保持原來的level。

2.7.3.4 情況四

    <logger name="com.tuacy.logback" level="error" additivity="false"/>

    <root level="info">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>

? ? ??上述配置等價于

    <logger name="com.tuacy.logback" level="error" additivity="false"/>

? ? ??不會有打印的

2.7.3.5 情況五

    <logger name="com.tuacy.logback" level="error">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </logger>

    <root level="info">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>

? ? ??上述配置等價于

    <logger name="com.tuacy.logback" level="error">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </logger>

    <root level="error">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>

? ? ??會打印error級別的日志,而且會打印兩次。logger的一次,root的一次。

2.7.3.6 情況六

    <logger name="com.tuacy.logback" level="error" additivity="false">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </logger>

    <root level="info">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </root>

? ? ??上述配置等價于

    <logger name="com.tuacy.logback" level="error" additivity="false">
        <!-- 控制臺輸出 -->
        <appender-ref ref="CONSOLE"/>
    </logger>

? ? ??所以只會打印一次error級別的日志信息。

2.8 日志模板配置

? ? ??日志模板配置,使用%為前綴讓解析器識別特殊輸出模式,然后以{}后綴結(jié)尾,內(nèi)部指定相應(yīng)的參數(shù)設(shè)置。

2.8.1 模板輸入?yún)?shù)

模板輸入?yún)?shù) 對應(yīng)的類 對應(yīng)輸出
d DateConverter 輸出logger時間
date DateConverter 輸出logger時間
r RelativeTimeConverter 輸出應(yīng)用啟動到日志時間觸發(fā)時候的毫秒數(shù)
relative RelativeTimeConverter 輸出應(yīng)用啟動到日志時間觸發(fā)時候的毫秒數(shù)
level LevelConverter 輸出logger對應(yīng)的等級
le LevelConverter 輸出logger對應(yīng)的等級
p LevelConverter 輸出logger對應(yīng)的等級
t ThreadConverter 輸出logger對應(yīng)線程名字
thread ThreadConverter 輸出logger對應(yīng)線程名字
lo LoggerConverter 輸出logger對應(yīng)的名字
logger LoggerConverter 輸出logger對應(yīng)的名字
c LoggerConverter 輸出logger對應(yīng)的名字
m MessageConverter 輸出logger對應(yīng)的信息
msg MessageConverter 輸出logger對應(yīng)的信息
message MessageConverter 輸出logger對應(yīng)的信息
C ClassOfCallerConverter 輸出調(diào)用方發(fā)布日志事件的完整類名
class ClassOfCallerConverter 輸出調(diào)用方發(fā)布日志事件的完整類名
M MethodOfCallerConverter 輸出發(fā)布日志請求的方法名
method MethodOfCallerConverter 輸出發(fā)布日志請求的方法名
L LineOfCallerConverter 輸出log請求的行數(shù)
line LineOfCallerConverter 輸出log請求的行數(shù)
F FileOfCallerConverter 輸出發(fā)布日志請求的java源碼的文件名
file FileOfCallerConverter 輸出發(fā)布日志請求的java源碼的文件名
X MDCConverter 輸出和發(fā)布日志事件關(guān)聯(lián)的線程的MDC
mdc MDCConverter 輸出和發(fā)布日志事件關(guān)聯(lián)的線程的MDC
ex ThrowableProxyConverter 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息
exception ThrowableProxyConverter 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息
rEx RootCauseFirstThrowableProxyConverter 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息
rootException RootCauseFirstThrowableProxyConverter 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息
throwable ThrowableProxyConverter 輸出和日志事件關(guān)聯(lián)的異常的堆棧信息
xEx ExtendedThrowableProxyConverter 和上面一樣,此外增加類的包信息
xException ExtendedThrowableProxyConverter 和上面一樣,此外增加類的包信息
xThrowable ExtendedThrowableProxyConverter 和上面一樣,此外增加類的包信息
nopex NopThrowableInformationConverter 當我們想不輸出異常信息時,使用這個。其假裝處理異常,其實無任何輸出
nopexception NopThrowableInformationConverter 當我們想不輸出異常信息時,使用這個。其假裝處理異常,其實無任何輸出
cn ContextNameConverter 輸出在類附加到日志上的上下文名字
contextName ContextNameConverter 輸出在類附加到日志上的上下文名字
caller CallerDataConverter 輸出產(chǎn)生日志事件的調(diào)用者的位置信息
marker MarkerConverter 輸出和日志請求關(guān)聯(lián)的marker
property PropertyConverter 輸出屬性對應(yīng)的值,一般為System.properties中的屬性
n LineSeparatorConverter 輸出依賴系統(tǒng)的行分隔符
black BlackCompositeConverter 顏色格式black
red RedCompositeConverter 顏色格式red
green GreenCompositeConverter 顏色格式green
yellow YellowCompositeConverter 顏色格式y(tǒng)ellow
blue BlueCompositeConverter 顏色格式blue
magenta MagentaCompositeConverter 顏色格式magenta
cyan CyanCompositeConverter 顏色格式cyan
white WhiteCompositeConverter 顏色格式white
gray GrayCompositeConverter 顏色格式gray
boldRed BoldRedCompositeConverter 顏色格式boldRed
boldGreen BoldGreenCompositeConverter 顏色格式boldGreen
boldYellow BoldYellowCompositeConverter 顏色格式boldYellow
boldBlue BoldBlueCompositeConverter 顏色格式boldBlue
boldMagenta BoldMagentaCompositeConverter 顏色格式boldMagenta
boldCyan BoldCyanCompositeConverter 顏色格式boldCyan
boldWhite BoldWhiteCompositeConverter 顏色格式boldWhite
highlight HighlightingCompositeConverter 顏色格式highlight
lsn LocalSequenceNumberConverter 顏色格式lsn

? ? ??d,data可以配置額外的參數(shù),用來確定日期格式。輸出日志的打印日志,模式語法與java.text.SimpleDateFormat 兼容。

? ? ??c、lo、logger輸出日志的logger名,可有一個整形參數(shù),功能是縮短logger名,設(shè)置為0表示只輸入logger最右邊點符號之后的字符串

模板 數(shù)據(jù)源 結(jié)果
%logger mainPackage.sub.sample.Bar mainPackage.sub.sample.Bar
%logger{0} mainPackage.sub.sample.Bar Bar
%logger{5} mainPackage.sub.sample.Bar m.s.s.Bar
%logger{10} mainPackage.sub.sample.Bar m.s.s.Bar
%logger{15} mainPackage.sub.sample.Bar m.s.sample.Bar
%logger{16} mainPackage.sub.sample.Bar m.sub.sample.Bar
%logger{26} mainPackage.sub.sample.Bar mainPackage.sub.sample.Bar

2.8.2 模板長度設(shè)置

? ? ??每個模板配置都是可以限制模長度的,上面介紹了模塊可以設(shè)置那么多的輸入?yún)?shù),其實每個輸入?yún)?shù)都是可以限制長度的。

日志模板配置 解釋
%5p 級別從左顯示5個字符寬度(從左到右)
%-4L 行號,保留后面四位字符寬度(從右到左)
%15.20t 線程名字(如果寬度不足15,左側(cè)補空白;如果寬度超過20,從左側(cè)截斷)

三 spring boot項目使用logback

3.1 pom依賴

? ? ??在Spring Boot項目中要使用logback原則上是要添加spring-boot-starter-logging依賴的。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>

但是因為我們使用Spring Boot肯定會添加

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

又因為spring-boot-starter里面已經(jīng)包含了對于spring-boot-starter-logging的依賴,所以我們一般在項目中不用顯示的添加spring-boot-starter-logging。

3.1 logback配置文件

? ? ??spring boot項目中使用logback.關(guān)于配置文件官方推薦使用的xml名字的格式為:logback-spring.xml而不是logback.xml(當然了,你也可以使用logback.xml),因為帶spring后綴的可以使用<springProfile>這個標簽來控制比如生成環(huán)境還是調(diào)試環(huán)境。比如如下的配置分了對生成環(huán)境和開發(fā)環(huán)境做了一個簡單的區(qū)分.

<configuration scan="true" scanPeriod="10 seconds">

...

    <!-- 生產(chǎn)環(huán)境下,將此級別配置為適合的級別,以免日志文件太多或影響程序性能 -->
    <!--
        <root>元素也是<logger>元素,logger。只有一個level屬性。
        root 元素配置根 logger。該元素有一個 level 屬性。沒有 name 屬性,因為已經(jīng)被命名為“root”
        <root>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。
    -->
    <springProfile name="dev">
        <root level="info">
            <!-- 控制臺輸出 -->
            <appender-ref ref="CONSOLE"/>
            <!-- 文件輸出 -->
            <appender-ref ref="SYS_LOG"/>
            <!-- 錯誤日志 -->
            <appender-ref ref="ERROR_LOG"/>
        </root>
    </springProfile>
    <springProfile name="pro">
        <root level="warn">
            <!-- 控制臺輸出 -->
            <appender-ref ref="CONSOLE"/>
            <!-- 文件輸出 -->
            <appender-ref ref="SYS_LOG"/>
            <!-- 錯誤日志 -->
            <appender-ref ref="ERROR_LOG"/>
        </root>
    </springProfile>
</configuration>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容