spring boot slf4j logback listener filter json aop http get scheduling tasks

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目錄下,新增設定檔,檔名可為以下幾種:

  1. logback-spring.xml (推薦)
  2. logback.xml
  3. logback-spring.groovy
  4. 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 ~


, , ,

Related posts

Latest posts