Spring Boot 中文件和控制台附加器的不同日誌級別
1.概述
當我們建立 Spring Boot 應用程式時,我們知道良好的日誌記錄是關鍵;它可以幫助我們觀察、排除故障並真正了解應用程式的流程。
在本文中,我們將探討如何使用 Spring Boot 中的預設日誌框架Logback
實作FILE
和CONSOLE
附加程式的日誌等級的分離。
2. 項目設定
在深入研究日誌配置之前,我們需要一個可以運行的 Spring Boot 應用程式作為示範。讓我們逐步了解如何設定項目。
2.1. 新增依賴項
Logback 和 SLF4J 是 Spring Boot 的預設日誌實作。如果我們已經使用了[spring-boot-starter-web](https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web)
或任何其他捆綁了[spring-boot-starter-logging](https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-logging)
的 Spring Boot starter,則這一點同樣適用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.2. 建立控制器
接下來,我們建立一個簡單的控制器來產生一些用於測試的日誌訊息:
@RestController
public class LogController {
private static final Logger logger = LoggerFactory.getLogger(LogController.class);
@GetMapping("/log")
public String generateLogs() {
logger.trace("This is a TRACE message from controller.");
logger.debug("This is a DEBUG message from controller.");
logger.info("This is an INFO message from controller.");
logger.warn("This is a WARN message from controller.");
logger.error("This is an ERROR message from controller.");
return "Logs generated!";
}
}
日誌等級遵循嚴格的層次結構: TRACE
最低,然後是DEBUG, INFO, WARN, ERROR, and FATAL
。當我們為附加器或記錄器定義日誌等級時,我們確保僅處理特定等級及更嚴重的訊息。
3.建立logback-spring.xml
文件
我們解決方案的核心在於logback-spring.xml
檔。我們只需將此檔案放在src/main/resources
目錄中,Spring Boot 就會自動取得它。這使我們能夠精確地定義要記錄的內容、日誌的儲存位置以及詳細程度。
3.1. 屬性標籤
讓我們先來看看屬性標籤:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOGS_HOME" value="./logs"/>
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<property name="FILE_NAME" value="my-spring-app"/>
<configuration>
這些變數定義了一些常用值,例如日誌的存放位置( LOGS_HOME
)、控制台輸出的格式( CONSOLE_LOG_PATTERN
)、檔案輸出的格式( FILE_LOG_PATTERN
)以及日誌檔案的基本名稱( FILE_NAME
)。使用屬性可以使配置更簡潔,更容易更新。
3.2. 控制台附加器標籤
本節定義如何處理控制台的日誌:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
對於控制台輸出,我們定義了一個名為「 CONSOLE
」的附加器。它告訴Logback
使用其內建的ConsoleAppender
將輸出直接發送到我們的標準控制台。在這個附加器中,我們使用<encoder>
將原始日誌訊息轉換為可讀格式。此編碼器中的<Pattern>
標籤套用了我們預先定義的CONSOLE_LOG_PATTERN
,這確保了所有控制台日誌的外觀一致且易於閱讀。
至關重要的是,我們隨後引入了一個過濾器: <filter class=”ch.qos.logback.classic.filter.ThresholdFilter”>
。這是控制日誌等級的關鍵元件;當控制台的ThresholdFilter
設定為INFO
時,我們僅顯示INFO
等級或更高等級的日誌訊息,即INFO, WARN, ERROR,
和FATAL
訊息。
3.3. 文件附加器
讓我們分解一下文件附加器的每個部分:
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOGS_HOME}/${FILE_NAME}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>${FILE_LOG_PATTERN}</Pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
對於檔案輸出,我們定義了一個名為「 FILE
」的附加器,並選擇ch.qos.logback.core.FileAppender
作為其類別。這告訴 Logback,我們只需要一個將所有日誌寫入單一持續成長的檔案的附加器。我們指定活動日誌檔案的確切路徑: <file>${LOGS_HOME}/${FILE_NAME}.log</file>
。該路徑解析為./logs/my-spring-app.log
。與控制台一樣,我們在此處使用<encoder>
。它使用我們的FILE_LOG_PATTERN
格式化每個日誌條目,以確保一致的可讀性。
最後,我們加入了一個至關重要的<filter class=”ch.qos.logback.classic.filter.ThresholdFilter”>
,它是此文件附加器所特有的。我們將閾值設為DEBUG
,這表示任何DEBUG
等級或更高嚴重等級的日誌訊息(即DEBUG, INFO, WARN, ERROR, FATAL
)都會被捕獲並寫入日誌檔案。
3.4. 根記錄器
本節定義了我們的日誌訊息如何在應用程式中路由和處理:
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
我們的<root level=”DEBUG”>
是整個應用程式的預設日誌記錄器,它負責捕獲所有日誌訊息;Spring Boot 應用程式產生的任何日誌訊息最終都會經過這個根日誌記錄器。我們將其主級別設為DEBUG
,這表示它會處理DEBUG
或更高層級的訊息。從這裡開始,我們告訴這個根日誌記錄器將其處理的所有日誌訊息傳送到我們的CONSOLE
和FILE
附加器。
需要記住的是,我們的CONSOLE
appender
本身就具有設定為INFO
過濾器,因此它最終只會顯示符合其INFO
等級或更高標準的日誌。同樣,我們也將根記錄器處理後的訊息傳送到我們的FILE
附加器,我們已將其設定為DEBUG
。
現在我們可以執行我們的應用程式並點擊[localhost:8080/log](http://localhost:8080/log)
端點來查看產生的日誌。
4. 結論
在本教程中,我們示範如何透過使用 Logback 的ThresholdFilter
為 Spring Boot 應用程式中的FILE
和CONSOLE
附加程式配置不同的日誌記錄等級。這使我們能夠靈活地根據特定需求定制日誌輸出 - 保持控制台簡潔明了,以便進行日常監控,同時在日誌文件中保留詳細的DEBUG
級別信息,以便進行全面分析。
與往常一樣,本文的程式碼可在 GitHub 上找到。