SpringBoot 異步輸出 Logback 日誌

一、介紹

1.1 Logback

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

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

1.2 日誌級別

包括:TRACE 、DEBUG 、INFO 、WARN 和ERROR 。

1.2.1TRACE

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

1.2.2DEBUG

debug
DEBUG

1.2.3INFO

  • 系統運行信息
  1. Service方法中對於系統/業務狀態的變更;
  2. 主要邏輯中的分步驟。
  • 外部接口部分
  1. 客戶端請求參數(REST/WS);
  2. 調用第三方時的調用參數和調用結果。
  • 說明
INFO

1.2.4WARN

  • 不應該出現但是不影響程序、當前請求正常運行的異常情況:
  1. 有容錯機制的時候出現的錯誤情況;
  2. 找不到配置文件,但是系統能自動創建配置文件;
  • 即將接近臨界值的時候,例如:緩存池佔用達到警告線;
  • 業務異常的記錄,比如:當接口拋出業務異常時,應該記錄此異常。

1.2.5ERROR

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

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

不應該出現的情況:

如果進行了拋出異常操作,請不要記錄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 工程自帶logback 和slf4j 的依賴,所以重點放在編寫配置文件上,需要引入什麼依賴,日誌依賴衝突統統都不需要我們管了;
  2. logback 框架會默認加載classpath 下命名為logback-spring 或logback 的配置文件。
  3. 將所有日誌都存儲在一個文件中文件大小也隨著應用的運行越來越大並且不好排查問題,正確的做法應該是將ERROR 日誌和其他日誌分開,並且不同級別的日誌根據時間段進行記錄存儲。

二、logback 配置

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


<configuration>

<springproperty>

<appender>
<layout>
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n/<pattern>
/<layout>
/<appender>

<appender>

<filter>
<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>

<filenamepattern>${logPath}/info.%d.log/<filenamepattern>
<maxhistory>30/<maxhistory>
/<rollingpolicy>
/<appender>
<appender>

<filter>
<level>ERROR/<level>
/<filter>
<encoder>

<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n/<pattern>
/<encoder>


<rollingpolicy>

<filenamepattern>${logPath}/error.%d.log/<filenamepattern>
<maxhistory>30/<maxhistory>
/<rollingpolicy>
/<appender>

<appender>

<discardingthreshold>0/<discardingthreshold>

<queuesize>256/<queuesize>

<appender-ref>
/<appender>
<appender>

<discardingthreshold>0/<discardingthreshold>

<queuesize>256/<queuesize>

<appender-ref>
/<appender>

<root>
<appender-ref>
<appender-ref>
<appender-ref>
/<root>
/<configuration>

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

logging:
path: ./logs

2.2 標籤說明

  • <root> 標籤:指定最基礎的日誌輸出級別;/<root>
  • <appender-ref> 標籤,添加append/<appender-ref>
  • <appender> 標籤:指定日誌的收集策略/<appender>
  1. name 屬性指定appender 命名
  2. class 屬性指定輸出策略,通常有兩種,控制檯輸出和文件輸出,文件輸出就是將日誌進行一個持久化。ConsoleAppender 將日誌輸出到控制檯。
  • <filter> 標籤:指定過濾策略/<filter>
  • <level> :指定過濾的類型。/<level>
  • <encoder> 標籤:使用該標籤下的<pattern> 標籤指定日誌輸出格式。/<pattern>/<encoder>
  • <rollingpolicy> 標籤:指定收集策略,比如基於時間進行收集/<rollingpolicy>
  • 標籤指定生成日誌保存地址,實現了按天分類以及日誌的目標了。

三、 源碼

Github 示例源碼


分享到:


相關文章: