logback-spring.xml配置簡述

什麼是 Logback

logback繼承自log4j,它建立在有十年工業經驗的日誌系統之上。它比其它所有的日誌系統更快並且更小,包含了許多獨特並且有用的特性。

這話是官網說的

Logback 的配置

Configruation

從上面的配置例子中我們可以看到根節點爲<configuration>

在根節點的配置中包含了三個屬性如下:

  • scan: 當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true
  • scanPeriod: 設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scantrue時,此屬性生效。默認的時間間隔爲1分鐘。
  • debug: 當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false

比如如下配置:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
</configuration> 

Property

<property>標籤作爲<configuration>標籤的子標籤主要用來定義變量的,它有namevalue兩個屬性,他的值會進入logger的上下文中,使用${name}可以引用到。

  • name: 變量的名稱。
  • value: 變量的值。

比如如下配置:

<property name="APP_NAME" value="DEMO"/>

Timestamp

<timestamp>標籤作爲<configuration>標籤的子標籤主要用來獲取當前時間的字符串,它有keydataPattern兩個屬性,它也同樣會進入logger的上下文中,使用${key}可以引用到。

  • key: 表示此標籤的名字,類似上面propertyname作用。
  • dataPattern: 設置將當前時間(解析配置文件的時間)轉換爲字符串的模式,遵循java.txt.SimpleDateFormat的格式。

比如如下配置:

<timestamp key="FULL_DATE" dataPattern="yyyy-MM-dd HH:mm:ss"/>

emmmm感覺好像用的不多。

Appender

<appender>標籤是寫日誌的組件,它主要有兩個屬性即nameclass

  • name: 即指定該組件的名稱。
  • class: 爲全限定名,他們必須實現自 ch.qos.logback.core.Appender接口。

常用的Appender有三種,他們分別是ConsoleAppenderFileAppenderRollingFileAppender

選擇每一個不同的Appender,所具有的子節點是不同的。

在開始介紹不同的Appender之前,先介紹幾個轉換標記,因爲在下面寫文件名以及格式化日誌的時候會用到:

  • %d: 輸出日誌時間點的日期或時間,指定格式的方式 %d{yyyy-MM-dd HH:mm:ss}

  • %i: 這是個一個自增索引,在分文件的時候,達到設的限制時,索引便會自增,從0開始,下面會用到

  • %p: 輸出優先級,即DEBUGINFOWARNERRORFATAL

  • %r: 輸出從應用啓動到輸出該日誌所耗費的毫秒數

  • %t: 輸出產生該日誌的線程名

  • %f: 輸出日誌所屬的類別名

  • %c: 輸出日誌類的全名

  • %l: 輸出日誌事件的發生位置,即輸出日誌語句在他所在類別的第幾行。

  • %m: 輸出代碼中指定的信息,如log(message)中的message

  • %n: 輸出一個換行符號

ConsoleAppender

ConsoleAppender所對應的是將日誌寫到控制檯的,它具有以下子節點:

  • <encoder>: 對日誌進行格式化。

例如:

<!-- 控制檯輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>
            [%-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n</pattern>
        <charset>UTF-8</charset>
    </encoder>
</appender>

FileAppender

FileAppender是將日誌寫入到文件中,它有以下子節點:

  • <file>: 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
  • <append>: 如果是true,日誌被追加到文件結尾,如果是false,清空現存文件,默認是true
  • <encoder>: 對日誌進行格式化。
  • <prudent>: 如果是true,日誌會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是false

例如:

<!-- 全量輸出,用於 Admin 監控日誌 -->
<appender name="MONITOR_FILE" class="ch.qos.logback.core.FileAppender">
    <encoder>
        <pattern>${PATTERN}</pattern>
        <charset>UTF-8</charset>
    </encoder>
    <file>logs/${APP_NAME}.log</file>
    <prudent>true</prudent>
</appender>

這裏的${PATTERN}就是取的上文中提到的<property>標籤,將[%-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n定義在其中了

RollingFileAppender

RollingFileAppender是個滾動記錄文件的組件,先將日誌記錄到指定文件,當符合指定的條件時,會將日誌文件截斷記錄到其他文件。有以下子節點:

  • <file>: 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
  • <encoder>: 對日誌進行格式化。
  • <append>: 如果是true,日誌被追加到文件結尾,如果是false,清空現存文件,默認是true
  • <rollingPolicy>: 當發生滾動時,決定RollingFileAppender的行爲,涉及文件移動和重命名。屬性class定義具體的滾動策略類。這裏有幾種常見的策略,比如:
    • TimeBasedRollingPolicy: 這是一種相對比較常用的策略,可以按天、按月等來分日誌文件。
    • SizeAndTimeBasedRollingPolicy: 這種策略是用來在比如按日期歸檔文件的時候,想要限制其大小,可以使用這種策略來實現。

例如:

<!-- 記錄 INFO 日誌 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <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.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/${APP_NAME}/info-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>32 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <prudent>true</prudent>
    </appender>

Logger

該節點設置某一個包下或者某一個類的日誌級別的,他有以下屬性:

  • name: 用來指定受此logger作用的某一個包或者具體的某一個類。
  • level: 用來設置當前指定包或類的日誌級別,大小寫不敏感,可以設置:TRACEDEBUGINFOWARNERRORALLOFF,還有一個特殊的值INHERITED或者NULL,代表強制執行上級的級別,如果未設置此屬性,那麼當前logger將會繼承上級的級別。
  • addtivity: 是否向上級logger傳遞打印信息。默認是true

例如:

<logger name="org.mybatis.spring" level="INFO" />

Root

<root>節點也是一個必選的節點,用來指定基礎的日誌輸出級別,就是除了上面<logger>指定的,其他都是按此級別的,它只有一個level屬性:

level: 也是用來指定日誌級別的,但是這裏不能設置特殊的值INHERITED或者NULL了,默認是DEBUG,其可以包含零個或者多個元素,標識使用哪些appender會在這裏生效。

例如:

<root level="INFO">
  <appender-ref ref="STDOUT" />
  <appender-ref ref="INFO_FILE" />
  <appender-ref ref="WARN_FILE" />
  <appender-ref ref="DEBUG_FILE" />
  <appender-ref ref="ERROR_FILE" />
</root>

完整示例

這個便是在學習這些配置的時候,結合自己要寫的工程編寫的logbakc-spring.xml文件,結合上面所說的配置,再加上少量註釋,應該大致可以理解了:

<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
<configuration scan="true" scanPeriod="10 seconds">

    <property name="APP_NAME" value="queen-registry"/>
    <property name="PATTERN" value="[%-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n"/>

    <!-- 控制檯輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 全量輸出,用於 Admin 監控日誌 -->
    <appender name="MONITOR_FILE" class="ch.qos.logback.core.FileAppender">
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <file>logs/${APP_NAME}.log</file>
        <prudent>true</prudent>
    </appender>

    <!-- 記錄 INFO 日誌 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <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.TimeBasedRollingPolicy">
            <fileNamePattern>${APP_NAME}/logs/info-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>32 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <prudent>true</prudent>
    </appender>

    <!-- 記錄 WARN 日誌 -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <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.TimeBasedRollingPolicy">
            <fileNamePattern>${APP_NAME}/logs/warn-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>32 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <prudent>true</prudent>
    </appender>

    <!-- 記錄 DEBUG 日誌 -->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <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.TimeBasedRollingPolicy">
            <fileNamePattern>${APP_NAME}/logs/debug-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>32 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <prudent>true</prudent>
    </appender>

    <!-- 記錄 ERROR 日誌 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <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>${APP_NAME}/logs/error-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>32 MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <prudent>true</prudent>
    </appender>
 
    <!-- 這裏的 springProfile 主要是用來區分環境的 -->
    <!-- 開發、預發環境 -->
    <springProfile name="dev, staging">
        <root level="INFO">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="MONITOR_FILE" />
        </root>
        <logger name="top.felixu.queen" level="DEBUG"/>
        <logger name="org.mybatis.spring" level="INFO" />
        <logger name="com.netflix.discovery" level="INFO" />
        <logger name="org.springframework.amqp.rabbit" level="INFO" />
    </springProfile>

    <!-- 生產環境 -->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="STDOUT" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="WARN_FILE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="ERROR_FILE" />
        </root>
    </springProfile>
</configuration>

結語

在寫完這篇文章的時候還發現了箇中文網http://www.logback.cn/

參考自[logback官網](

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章