Spring Boot EP 8:SLF4J + Logback-留存日誌Logging
Logback V.S. Log4j
Logback與Log4j是同一個作者的心血,Log4j名聲大、用途廣、歷史悠久,一直是眾多Java開發者的預設選擇,但Log4j最大的缺點就是效率差且臃腫,最近還發生了重大的資安事件(iThome新聞),為了擺脫這些問題,又開發出Logback作為替代品,其高效能且豐富的設定檔選項,讓Logback逐漸成為Spring Boot開發的預設項目,只要使用Spring Boot Starter建立專案,預設就是使用Logback作為日誌記錄的套件。
SLF4J
Simple Logging Facade for Java,縮寫SLF4J,故其名是一個用作實現日誌Logging的介面層,SLF4J本身並不處理日誌,而是提供一個開發介面來操作與其相容的日誌套件,包含上述所提到的Logback與Log4j,參考下圖即可明白SLF4J的角色了:

安裝SLF4J + Logback
如上所述,本篇的專案使用Spring Boot Starter建立,所以預設就是使用SLF4J與Logback這個日誌Logging的組合,並不需要另外其他的設置。
設定Logback
步驟1:在STOCKMARKET/src/main/resources目錄下,新增設定檔,檔名可為以下幾種:
- logback-spring.xml (推薦)
- logback.xml
- logback-spring.groovy
- logback.groovy
步驟2:設定檔內添加以下基本內容:
<configuration>
<!-- 定義以Console顯示日誌 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<!-- 設計日誌內容格式 -->
<Pattern>
%gray(%d{YYYY-MM-dd HH:mm:ss.SSS}) %highlight(%-5level) %gray([%t]) %cyan(%c{1.}): %msg%n%throwable
</Pattern>
</layout>
</appender>
<!-- 定義以檔案保留日誌 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>/xxx/xxx/xxx/stdout.log</File>
<encoder>
<pattern>
<!-- 日誌寫檔僅保留關鍵字,無法定義顏色 -->
%d{YYYY-MM-dd HH:mm:ss.SSS} %-5level [%t] %c{1.}: %msg%n%throwable
</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 使用gzip將日誌壓縮起來,並以日期來命名 -->
<fileNamePattern>/xxx/xxx/xxx/stdout.log.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!-- 保留30天日誌 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 設定要被日誌紀錄下的等級 -->
<root level="info">
<!-- 連接到名為STDOUT的日誌格式 -->
<appender-ref ref="STDOUT" />
<!-- 連接到名為FILE的日誌格式 -->
<appender-ref ref="FILE" />
</root>
</configuration>
步驟3:執行後,可以看到以下日誌訊息,可以發現內容、顏色與預設的稍有不同。

設定的路徑也會出現檔案,其內容也會按照設定產生。

註:若要將日誌寫到其他地方,如檔案、Kafka、ELK…等,請參考官網文件Appenders章節 (連結)。
註:若要設計更複雜的日誌格式,請參考官網文件Layout章節 (連結)。
使用SLF4J寫下日誌
步驟1:在HelloController.java這個控制器下,宣告一個SLF4J的Logger物件,透過該物件幫我們紀錄日誌。
package stockmarket.jovepater.com.stockmarket.Controllers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import stockmarket.jovepater.com.stockmarket.Classes.RspBody;
@RestController
public class HelloController {
@GetMapping("hello")
public RspBody Hello() {
// 宣告SLF4J的Logger日誌
Logger myLogger = LoggerFactory.getLogger(HelloController.class);
// 紀錄各種等級的事件
myLogger.trace("This is Hello API.");
myLogger.debug("This is Hello API.");
myLogger.info("This is Hello API.");
myLogger.warn("This is Hello API.");
myLogger.error("This is Hello API.");
return new RspBody("0000", "Success", "Hello World");
}
}
步驟2:執行這個API (http://127.0.0.1:8080/api/hello)後,可以在Console視窗區看到訊息,如下圖:

PS:僅有INFO、WARN、ERROR,原因在於Logback設定高於INFO以上的等級才要顯示。
~ END ~





