SpringBoot 異步輸出 Logback 日誌

1、介紹

1.1 Logback

  Logback是由log4j創始人設計的另外一個開源日誌組件,它分爲下面下個模塊:java

  1. logback-core:其它兩個模塊的基礎模塊
  2. logback-classic:它是log4j的一個改良版本,同時它完整實現了slf4j API使你能夠很方便地更換成其它日誌系統如log4j或JDK14 Logging
  3. logback-access:訪問模塊與Servlet容器集成提供經過Http來訪問日誌的功能

1.2 日誌級別

包括:TRACEDEBUGINFOWARNERRORgit

1.2.1 TRACE

特別詳細的系統運行完成信息,業務代碼中,不要使用。(除非有特殊用意,不然請使用DEBUG級別替代)github

1.2.2 DEBUG

  1. 能夠填寫全部的想知道的相關信息(但不表明能夠隨便寫,debug信息要有意義,最好有相關參數);
  2. 生產環境須要關閉DEBUG信息
  3. 若是在生產狀況下須要開啓DEBUG,須要使用開關進行管理,不能一直開啓。

1.2.3 INFO

  • 系統運行信息spring

    1. Service方法中對於系統/業務狀態的變動;
    2. 主要邏輯中的分步驟。
  • 外部接口部分緩存

    1. 客戶端請求參數(REST/WS);
    2. 調用第三方時的調用參數和調用結果。
  • 說明springboot

  1. 並非全部的service都進行出入口打點記錄,單1、簡單service是沒有意義的;
  2. 對於複雜的業務邏輯,須要進行日誌打點,以及埋點記錄,好比電商系統中的下訂單邏輯,以及OrderAction操做(業務狀態變動);
  3. 對於整個系統的提供出的接口(REST/WS),使用INFO記錄入參;
  4. 若是全部的service爲SOA架構,那麼能夠當作是一個外部接口提供方,那麼必須記錄入參;
  5. 調用其餘第三方服務時,全部的出參和入參是必需要記錄的(由於你很難追溯第三方模塊發生的問題)。

1.2.4 WARN

  • 不該該出現可是不影響程序、當前請求正常運行的異常狀況:架構

    1. 有容錯機制的時候出現的錯誤狀況;
    2. 找不到配置文件,可是系統能自動建立配置文件;
  • 即將接近臨界值的時候,例如:緩存池佔用達到警告線;
  • 業務異常的記錄,好比:當接口拋出業務異常時,應該記錄此異常。app

1.2.5 ERROR

影響到程序正常運行、當前請求正常運行的異常狀況:框架

  1. 打開配置文件失敗;
  2. 全部第三方對接的異常(包括第三方返回錯誤碼);
  3. 全部影響功能使用的異常,包括:SQLException和除了業務異常以外的全部異常(RuntimeExceptionException)。

不該該出現的狀況:
若是進行了拋出異常操做,請不要記錄ERROR日誌,由最終處理方進行處理:異步

反例(不要這麼作):

try{
    ....
}catch(Exception ex){
  String errorMessage=String.format("Error while reading information of user [%s]",userName);
  logger.error(errorMessage,ex);
  throw new UserServiceException(errorMessage,ex);
}

1.3 SpringBoot 中 logback

  1. SpringBoot工程自帶logbackslf4j的依賴,因此重點放在編寫配置文件上,須要引入什麼依賴,日誌依賴衝突通通都不須要咱們管了;
  2. logback框架會默認加載classpath下命名爲logback-springlogback的配置文件。
  3. 將全部日誌都存儲在一個文件中文件大小也隨着應用的運行愈來愈大而且很差排查問題,正確的作法應該是將ERROR日誌和其餘日誌分開,而且不一樣級別的日誌根據時間段進行記錄存儲。

2、logback 配置

2.1 配置文件logback-spring.xml示例

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- 屬性文件:在配置文件中找到對應的配置項 -->
    <springProperty scope="context" name="logPath" source="logging.path"/>

    <!-- 輸出到控制檯 -->
    <appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
        </layout>
    </appender>

    <!-- 獲取比info級別高(包括info級別)但除error級別的日誌 -->
    <appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 指定過濾策略 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <!-- 指定日誌輸出格式 -->
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
        </encoder>

        <!-- 指定收集策略:滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 指定生成日誌保存地址 -->
            <fileNamePattern>${logPath}/info.%d.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 指定過濾策略 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <!-- 指定日誌輸出格式 -->
            <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
        </encoder>
        <!-- 指定收集策略:滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--指定生成日誌保存地址 -->
            <fileNamePattern>${logPath}/error.%d.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <!-- 異步輸出 -->
    <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丟失日誌.默認的,若是隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默認的隊列的深度,該值會影響性能.默認值爲256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多隻能添加一個 -->
        <appender-ref ref="INFO-LOG"/>
    </appender>

    <appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丟失日誌.默認的,若是隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日誌 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默認的隊列的深度,該值會影響性能.默認值爲256 -->
        <queueSize>256</queueSize>
        <!-- 添加附加的appender,最多隻能添加一個 -->
        <appender-ref ref="ERROR-LOG"/>
    </appender>

    <!-- 指定最基礎的日誌輸出級別 -->
    <root level="info">
        <appender-ref ref="CONSOLE-LOG" />
        <appender-ref ref="INFO-LOG" />
        <appender-ref ref="ERROR-LOG" />
    </root>

</configuration>

項目配置文件中配置日誌輸出地址

logging:
  path: ./logs

2.2 標籤說明

  • <root>標籤:指定最基礎的日誌輸出級別;
    • <appender-ref>標籤,添加append
  • <appender>標籤:指定日誌的收集策略
    1. name屬性指定appender命名
    2. class屬性指定輸出策略,一般有兩種,控制檯輸出和文件輸出,文件輸出就是將日誌進行一個持久化。ConsoleAppender將日誌輸出到控制檯。
  • <filter>標籤:指定過濾策略
    • <level>:指定過濾的類型。
  • <encoder>標籤:使用該標籤下的<pattern>標籤指定日誌輸出格式。

  • <rollingPolicy>標籤:指定收集策略,好比基於時間進行收集

    • 標籤指定生成日誌保存地址,實現了按天分類以及日誌的目標了。

3、 源碼

Github 示例源碼

相關文章
相關標籤/搜索