Spring Boot Logback 常用功能與設定
1. 日誌分級(Logging Levels)
TRACE:最詳細的日誌,幾乎所有調試訊息都會顯示。DEBUG:一般開發與測試階段常用的等級,記錄系統的細節訊息。INFO:用於記錄關鍵業務流程或系統狀態變化,適合正式環境。WARN:當出現潛在問題時,例如記憶體用量接近上限、磁碟空間不足。ERROR:系統錯誤或異常,會影響功能但不一定導致崩潰。OFF:完全關閉日誌。
2. 控制台與檔案輸出
- ConsoleAppender(輸出到控制台)
- FileAppender(輸出到檔案)
- RollingFileAppender(分批輸出,避免檔案過大)
3. 日誌輪轉(Log Rotation)
- 使用
RollingFileAppender,設定檔案大小與保存數量,避免單一日誌檔案過大。
4. JSON 格式化輸出
- 使用
logstash-logback-encoder來支援 JSON 格式日誌,適合與 ELK(Elasticsearch + Logstash + Kibana)整合。
5. 不同環境的日誌設定
- 使用
spring.profiles.active來切換不同環境的logback-spring.xml配置,例如dev和prod。
6. 記錄特定 package 的日誌
- 針對特定的 package 或 class 設定不同的日誌等級。
Logback XML 配置範例
這是一個常見的 logback-spring.xml 設定檔。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 設定 Spring Profile -->
<springProperty name="LOG_LEVEL" source="logging.level.root" defaultValue="INFO"/>
<!-- 設定 Console 輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 設定檔案輸出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按日期輪轉日誌,目前這樣設定,log檔的名稱會是 app-2021-01-01.0.log -->
<fileNamePattern>logs/app-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize> <!-- 單個日誌檔案的最大大小 -->
<maxHistory>30</maxHistory> <!-- 最多保留 30 天的日誌 -->
<totalSizeCap>1GB</totalSizeCap> <!-- 總共最多保留 1GB 日誌,超過則刪除最舊的 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 設定不同 package 的日誌級別 -->
<logger name="com.example.service" level="DEBUG"/>
<logger name="org.springframework" level="WARN"/>
<!-- 根日誌設定 -->
<root level="${LOG_LEVEL}">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
</configuration>進階設定
1. JSON 格式輸出(適用於 ELK)
步驟 1:引入 Logstash 依賴
在 pom.xml 中加入:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.3</version>
</dependency>步驟 2:修改 logback-spring.xml
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/json-app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/json-app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="JSON_FILE"/>
</root>2. 不同環境的日誌設定
方式 1:透過 logback-spring.xml 自動載入
<springProfile name="dev">
<logger name="com.example" level="DEBUG"/>
</springProfile>
<springProfile name="prod">
<logger name="com.example" level="WARN"/>
</springProfile>在 application.properties 設定:
spring.profiles.active=dev方式 2:使用不同的 logback 配置檔
logback-dev.xmllogback-prod.xmllogback-test.xml
Spring Boot 會根據 spring.profiles.active 自動載入對應的日誌設定。
方式 3:設定異步日誌
- 如果怕寫日誌會影響效能,可以使用
AsyncAppender來實現異步日誌輸出。 - 讓日誌先進入一個佇列 (queueSize=500),然後由背景執行緒寫入檔案。
<appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>500</queueSize> <!-- 設定緩衝區大小 -->
<discardingThreshold>0</discardingThreshold> <!-- 避免丟失訊息 -->
<appender-ref ref="FILE"/>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC_FILE"/>
</root>總結
- 日誌級別(TRACE, DEBUG, INFO, WARN, ERROR)
- 控制台與檔案輸出
- 日誌輪轉(避免日誌過大)
- JSON 格式輸出(適合 ELK 整合)
- 不同環境的日誌設定(透過 Spring Profiles)
- 記錄特定 package 的日誌
- 異步日誌輸出(避免影響效能)
這些功能能幫助你的 Spring Boot 應用程式更好地管理與分析日誌!