1. 程式人生 > 程式設計 >Spring Boot Logback配置日誌過程解析

Spring Boot Logback配置日誌過程解析

這篇文章主要介紹了Spring Boot Logback配置日誌過程解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

出於效能等原因,Logback 目前是springboot應用日誌的標配; 當然有時候在生產環境中也會考慮和三方中介軟體採用統一處理方式。

配置時考慮點

  • 支援日誌路徑,日誌level等配置
  • 日誌控制配置通過application.yml下發
  • 按天生成日誌,當天的日誌>50MB回滾
  • 最多儲存10天日誌
  • 生成的日誌中Pattern自定義
  • Pattern中新增使用者自定義的MDC欄位,比如使用者資訊(當前日誌是由哪個使用者的請求產生),request資訊。此種方式可以通過AOP切面控制,在MDC中新增requestID,在spring-logback.xml中配置Pattern。
  • 根據不同的執行環境設定Profile - dev,test,product
  • 對控制檯,Err和全量日誌分別配置
  • 對第三方包路徑日誌控制

實現範例

如下兩個例子基本包含了上述的考慮點:

綜合範例

application.yml

logging:
 level:
  root: debug
 path: C:/data/logs/springboot-logback-demo
server:
 port: 8080
spring:
 application:
  name: springboot-logback-demo
debug: false

Spring-logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <!-- 日誌根目錄-->
  <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/data/logs/springboot-logback-demo"/>

  <!-- 日誌級別 -->
  <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/>

  <!-- 標識這個"STDOUT" 將會新增到這個logger -->
  <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>

  <!-- 日誌檔名稱-->
  <property name="LOG_PREFIX" value="spring-boot-logback" />

  <!-- 日誌檔案編碼-->
  <property name="LOG_CHARSET" value="UTF-8" />

  <!-- 日誌檔案路徑+日期-->
  <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" />

  <!--對日誌進行格式化-->
  <property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/>

  <!--檔案大小,預設10MB-->
  <property name="MAX_FILE_SIZE" value="50MB" />

  <!-- 配置日誌的滾動時間 ,表示只保留最近 10 天的日誌-->
  <property name="MAX_HISTORY" value="10"/>

  <!--輸出到控制檯-->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- 輸出的日誌內容格式化-->
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>${LOG_MSG}</pattern>
    </layout>
  </appender>

  <!--輸出到檔案-->
  <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
  </appender>

  <!-- 定義 ALL 日誌的輸出方式:-->
  <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!--日誌檔案路徑,日誌檔名稱-->
    <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>

    <!-- 設定滾動策略,當天的日誌大小超過 ${MAX_FILE_SIZE} 檔案大小時候,新的內容寫入新的檔案, 預設10MB -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

      <!--日誌檔案路徑,新的 ALL 日誌檔名稱,“ i ” 是個變數 -->
      <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern>

      <!-- 配置日誌的滾動時間 ,表示只保留最近 10 天的日誌-->
      <MaxHistory>${MAX_HISTORY}</MaxHistory>

      <!--當天的日誌大小超過 ${MAX_FILE_SIZE} 檔案大小時候,新的內容寫入新的檔案, 預設10MB-->
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>

    </rollingPolicy>

    <!-- 輸出的日誌內容格式化-->
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>${LOG_MSG}</pattern>
    </layout>
  </appender>

  <!-- 定義 ERROR 日誌的輸出方式:-->
  <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 下面為配置只輸出error級別的日誌 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>ERROR</level>
      <OnMismatch>DENY</OnMismatch>
      <OnMatch>ACCEPT</OnMatch>
    </filter>
    <!--日誌檔案路徑,日誌檔名稱-->
    <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>

    <!-- 設定滾動策略,當天的日誌大小超過 ${MAX_FILE_SIZE} 檔案大小時候,新的內容寫入新的檔案, 預設10MB -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

      <!--日誌檔案路徑,新的 ERR 日誌檔名稱,“ i ” 是個變數 -->
      <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern>

      <!-- 配置日誌的滾動時間 ,表示只保留最近 10 天的日誌-->
      <MaxHistory>${MAX_HISTORY}</MaxHistory>

      <!--當天的日誌大小超過 ${MAX_FILE_SIZE} 檔案大小時候,新的內容寫入新的檔案, 預設10MB-->
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>

    <!-- 輸出的日誌內容格式化-->
    <layout class="ch.qos.logback.classic.PatternLayout">
      <Pattern>${LOG_MSG}</Pattern>
    </layout>
  </appender>

  <!-- additivity 設為false,則logger內容不附加至root ,配置以配置包下的所有類的日誌的列印,級別是 ERROR-->
  <logger name="org.springframework"   level="ERROR" />
  <logger name="org.apache.commons"   level="ERROR" />
  <logger name="org.apache.zookeeper"  level="ERROR" />
  <logger name="com.alibaba.dubbo.monitor" level="ERROR"/>
  <logger name="com.alibaba.dubbo.remoting" level="ERROR" />

  <!-- ${LOG_ROOT_LEVEL} 日誌級別 -->
  <root level="${LOG_ROOT_LEVEL}">

    <!-- 標識這個"${STDOUT}"將會新增到這個logger -->
    <appender-ref ref="${STDOUT}"/>

    <!-- FILE_ALL 日誌輸出新增到 logger -->
    <appender-ref ref="FILE_ALL"/>

    <!-- FILE_ERROR 日誌輸出新增到 logger -->
    <appender-ref ref="FILE_ERROR"/>
  </root>

</configuration>

Profile 相關的配置可以參考:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml" />
  
   <!-- roll by day -->
   <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
      <fileNamePattern>logs/springboot-logback-demo.%d{yyyy-MM-dd}.log</fileNamePattern>  
      <maxHistory>30</maxHistory> 
    </rollingPolicy>  
    <encoder>  
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>  
    </encoder> 
  </appender> 
  
  <!-- dev -->
  <logger name="org.springframework.web" level="INFO"/>
    <root level="INFO">
    <appender-ref ref="FILE" />
  </root>

  <!-- test or production -->
  <springProfile name="test,prod">
    <logger name="org.springframework.web" level="INFO"/>
    <logger name="com.pdai.springboot" level="INFO"/>
    <root level="INFO">
      <appender-ref ref="FILE" />
    </root>
  </springProfile> 
</configuration>

參考文件

Logback官網

https://logback.qos.ch/manual/layouts.html#conversionWord

Logback官網 文件

https://logback.qos.ch/manual/index.html

Logback中Encoder Pattern

<encoder>
  <pattern>%d{HH:mm:ss} [%thread][%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
</encoder>

https://logback.qos.ch/manual/layouts.html#conversionWord

程式碼示例

@See https://github.com/realpdai/springboot-logback-demo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。