springboot項目配置logback日誌系統

記錄springboot項目配置logback日誌文件管理:

logback依賴jar包

SpringBoot項目配置logback理論上需要添加logback-classic依賴jar包:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

但是因為SpringBoot項目默認就是使用的就是logback日誌系統,創建SpringBoot項目時引入的spring-boot-starter或者spring-boot-starter-web依賴jar包中已經包含了spring-boot-starter-logging的依賴,裡面同時包含多種日誌系統依賴,如下圖所示:

包括logback和log4j,所以,無需額外添加依賴,直接配置logback.xml就可以了。

此外,如果需要切換為log4j2,那麼需要在spring-boot-starter-web依賴中排除springboot自帶的commons‐logging,然後在引入log4j2的依賴jar包,如下所示:

<!--排除 commons‐logging-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
      <exclusion>
      <groupId>commons‐logging</groupId>
      <artifactId>commons‐logging</artifactId>
      </exclusion>
   </exclusions>
</dependency>

<!--引入log4j2 -->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

logback的默認配置

前面說到SpringBoot項目默認使用logback,那麼對於logback的配置情況,SpringBoot又是如何定義的呢?

首先,SpringBoot會從resource包下查找logback-test.xmllogback.xml ,如果這兩個都不存在,則會調用BasicConfigurator,創建一個最小化的基本配置。

最小化配置由一個關聯到根loggerConsoleAppender組成,默認輸出模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%nroot logger級別為DEBUG,所以並不會生成日誌文件,只會輸出到控制台。

創建logback.xml配置文件

通過自定義logback.xml配置文件來控制日誌輸出情況,通常我們會配置三個日誌組件:

  1. 控制台輸出
  2. 輸出info級別日誌文件
  3. 輸出error級別日誌文件

以下為logback.xml完整配置

<!-- Logback configuration. See //logback.qos.ch/manual/index.html -->
<configuration scan="true" scanPeriod="2 seconds">
    <!--定義日誌文件的存儲地址-->
    <property name="LOG_PATH" value="./logs" />
    <!-- 控制台輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%-5level:級別從左顯示5個字元寬度,%t表示執行緒名,%msg:日誌消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:-} --- [%t] %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- info級別日誌文件輸出 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日誌文件輸出的文件名 -->
        <File>${LOG_PATH}/info.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 每日生成日誌文件或日誌文件大小超出限制後輸出的文件名模板 -->
            <fileNamePattern>${LOG_PATH}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 日誌文件保留天數 -->
            <maxHistory>30</maxHistory>
            <!-- 日誌文件最大大小:100MB -->
            <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:-} --- [%t] %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- error級別日誌文件輸出 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 日誌輸出級別,優先順序 > '<root level>' -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <File>${LOG_PATH}/error.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <maxFileSize>100MB</maxFileSize>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:-} --- [%t] %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 默認日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>

</configuration>

logback配置說明

根節點configuration

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

configuration包含以下三個屬性:

  • scan:配置文件發生更改時,進行重載,默認值為true
  • scanPeriod:監測配置文件是否有修改的時間間隔,默認值為6000,默認單位為毫秒
  • debug:列印logback內部日誌資訊,實時查看logback運行狀態,默認值為false

子節點property:

<property name="LOG_PATH" value="./logs" />

用來定義變數值,包含以下兩個屬性

  • name:變數名稱
  • value:變數定義的值

通過property定義的值會被插入到logger上下文中,可以使${}來使用變數,這裡定義了log的保存位置根目錄。

子節點appender:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

</appender>

是負責寫日誌的組件,通過自定義日誌組件控制日誌輸出的情況,包含以下兩個屬性:

  • name:組件名稱
  • class:組件class指定的類名

不同的class,對應不同的功能:

ch.qos.logback.core.ConsoleAppender會把日誌輸出到控制台

ch.qos.logback.core.rolling.RollingFileAppender把日誌內容輸出到指定文件

File節點:日誌文件輸出的文件名

<File>${LOG_PATH}/info.log</File>

filter節點:過濾器,用來指定日誌組件的日誌輸出級別,優先順序高於root節點的level。

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <level>ERROR</level>
</filter>

rollingPolicy節點:

滾動日誌文件配置,涉及日誌文件的移動和重命名,只有一個class屬性,用來指定滾動策略,這裡使用的是ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy

包含以下三個屬性:

  • fileNamePattern:發生滾動時的日誌命名方式
  • maxHistory:日誌文件的最大保留時間,超過設定時間後會自動刪除
  • maxFileSize:每份日誌文件的最大限制,超出限制後會重新生成,並將舊的日誌文件按照fileNamePattern設定的日誌命名方式進行命名
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <fileNamePattern>${LOG_PATH}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
    <maxHistory>30</maxHistory>
    <maxFileSize>100MB</maxFileSize>
</rollingPolicy>

子節點encoder

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
     <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:-} --- [%t] %logger{50} - %msg%n</pattern>
</encoder>

對記錄事件進行格式化,負責兩件事,一是把日誌資訊轉換成位元組數組,二是把位元組數組寫入到輸出流。
PatternLayoutEncoder 是唯一有用的且默認的encoder ,有一個節點,用來設置日誌的輸入格式。使用「%」加「轉換符」方式,如果要輸出「%」,則必須用「\」對「%」進行轉義。

子節點root

loger,是所有loger的最上級,且只有一個level節點,用類設置列印日誌的級別,默認值為debug,通常設置為info,此外還有trace、warn、error、all、off級別。
子節點appender-ref的ref屬性指定日誌組件名稱,即appendername屬性值。

使用logback

yml文件中增加logging.config指定配置文件地址,命名為logback時可以不需要配置,SpringBoot`會自動查找。

level設置指定路徑下的日誌輸出級別。

logging:
  config: classpath:logback.xml
  level:
    com:
      springboot: debug

如圖所示,項目啟動後,訪問介面輸出日誌內容並生成指定日誌文件:

內容參考

部落格園-ryelqy-logback的使用和logback.xml詳解