1. 引言
在本教程中,我們將探討如何通過運行時更改 Spring Boot 應用程序的日誌級別的方法。 就像許多事物一樣,Spring Boot 內置了日誌功能,並將其配置為我們所需要。 我們將探索如何調整正在運行應用程序的日誌級別。
我們將研究三種方法:使用 Spring Boot Actuator 日誌器端點、Logback 中的自動掃描功能,以及使用 Spring Boot Admin 工具。
2. Spring Boot Actuator
我們將首先使用 /loggers Actuator 端點來顯示和更改我們的日誌級別。<strong >/loggers</strong > 端點在 <em >actuator/loggers</em > 可訪問,我們可以通過將名稱作為路徑的一部分追加到路徑中來訪問特定的日誌器。
例如,我們可以使用 URL http://localhost:8080/actuator/loggers/root 訪問根日誌器。
2.1. 部署準備
讓我們首先配置我們的應用程序使用 Spring Boot Actuator。
首先,我們需要將 Spring Boot Actuator Maven 依賴 添加到我們的 pom.xml 文件中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>3.1.5</version>
</dependency>默認情況下,大多數端點已禁用,因此我們需要在我們的 application.properties 文件中啓用 /loggers 端點:
management.endpoints.web.exposure.include=loggers
management.endpoint.loggers.enabled=true最後,讓我們創建一個控制器,其中包含一系列日誌語句,以便我們可以觀察實驗的效果:
@RestController
@RequestMapping("/log")
public class LoggingController {
private Log log = LogFactory.getLog(LoggingController.class);
@GetMapping
public String log() {
log.trace("This is a TRACE level message");
log.debug("This is a DEBUG level message");
log.info("This is an INFO level message");
log.warn("This is a WARN level message");
log.error("This is an ERROR level message");
return "See the log for details";
}
}2.2. 使用 /loggers/ 端點
讓我們啓動我們的應用程序並訪問我們的日誌 API:
curl http://localhost:8080/log然後,讓我們檢查日誌,其中應該包含三個日誌語句:
2019-09-02 09:51:53.498 INFO 12208 --- [nio-8080-exec-1] c.b.s.b.m.logging.LoggingController : This is an INFO level message
2019-09-02 09:51:53.498 WARN 12208 --- [nio-8080-exec-1] c.b.s.b.m.logging.LoggingController : This is a WARN level message
2019-09-02 09:51:53.498 ERROR 12208 --- [nio-8080-exec-1] c.b.s.b.m.logging.LoggingController : This is an ERROR level message現在,讓我們調用 /loggers Actuator 端點來檢查我們的 com.baeldung.spring.boot.management.logging 包的日誌級別:
curl http://localhost:8080/actuator/loggers/com.baeldung.spring.boot.management.logging
{"configuredLevel":null,"effectiveLevel":"INFO"}要更改日誌級別,我們可以向 /loggers<</em/> 端點發出一個 POST<</em/> 請求:
curl -i -X POST -H 'Content-Type: application/json' -d '{"configuredLevel": "TRACE"}'
http://localhost:8080/actuator/loggers/com.baeldung.spring.boot.management.logging
HTTP/1.1 204
Date: Mon, 02 Sep 2019 13:56:52 GMT如果再次檢查日誌級別,我們應該看到它設置為 TRACE:
curl http://localhost:8080/actuator/loggers/com.baeldung.spring.boot.management.logging
{"configuredLevel":"TRACE","effectiveLevel":"TRACE"}最後,我們可以重新運行我們的日誌API,並觀察更改的效果。
curl http://localhost:8080/log現在,我們再次檢查日誌:
2019-09-02 09:59:20.283 TRACE 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController : This is a TRACE level message
2019-09-02 09:59:20.283 DEBUG 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController : This is a DEBUG level message
2019-09-02 09:59:20.283 INFO 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController : This is an INFO level message
2019-09-02 09:59:20.283 WARN 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController : This is a WARN level message
2019-09-02 09:59:20.283 ERROR 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController : This is an ERROR level message3. Logback 自動掃描
默認情況下,我們的 Spring Boot 應用程序使用 Logback 日誌庫。 現在,讓我們看看如何利用 Logback 的自動掃描功能來更改日誌級別。
首先,讓我們通過將名為 logback.xml 的文件放置在 src/main/resources 目錄下,添加一些 Logback 配置:
<configuration scan="true" scanPeriod="15 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.baeldung.spring.boot.management.logging" level="INFO" />
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>第一條關鍵信息位於 logback.xml 文件的第一行。通過將 scan 屬性設置為 true,我們告訴 Logback 檢查配置文件的更改。默認情況下,自動掃描每 60 秒一次。
將 scanPeriod 設置為 15 秒,則它將在 15 秒內重新加載,這樣我們就不必在實驗期間等待太長時間。
讓我們通過啓動應用程序並再次調用我們的日誌 API 來測試一下:
curl http://localhost:8080/log我們的輸出應反映出我們包中的 INFO 日誌級別:
10:21:13.167 [http-nio-8080-exec-1] INFO c.b.s.b.m.logging.LoggingController - This is an INFO level message
10:21:13.167 [http-nio-8080-exec-1] WARN c.b.s.b.m.logging.LoggingController - This is a WARN level message
10:21:13.168 [http-nio-8080-exec-1] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message現在,讓我們修改我們的 com.baeldung.spring.boot.management.logging 日誌器在 logback.xml 中的設置為 TRACE:
<logger name="com.baeldung.spring.boot.management.logging" level="TRACE" />在給予其15秒鐘後,讓我們重新運行日誌API,訪問 http://localhost:8080/log 並檢查日誌輸出。
10:24:18.429 [http-nio-8080-exec-2] TRACE c.b.s.b.m.logging.LoggingController - This is a TRACE level message
10:24:18.430 [http-nio-8080-exec-2] DEBUG c.b.s.b.m.logging.LoggingController - This is a DEBUG level message
10:24:18.430 [http-nio-8080-exec-2] INFO c.b.s.b.m.logging.LoggingController - This is an INFO level message
10:24:18.430 [http-nio-8080-exec-2] WARN c.b.s.b.m.logging.LoggingController - This is a WARN level message
10:24:18.430 [http-nio-8080-exec-2] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message4. Spring Boot Admin
通過 Spring Boot Admin 工具,我們調整日誌級別的方式是第三種。 要使用 Spring Boot Admin,我們需要創建一個服務器應用程序並配置我們的應用程序作為客户端。
4.1. 管理應用程序
要更改我們使用 Spring Boot Admin 的日誌級別,我們需要設置一個新的應用程序作為我們的管理服務器。我們可以使用 Spring Initialzr 來完成此操作。
讓我們將最新的 spring-boot-admin-starter-server 添加到我們的 pom.xml 中:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>3.1.5</version>
</dependency>有關設置Admin Server的詳細説明,請參閲《Spring Boot Admin指南》的第2章。第4章包含必要的安全設置信息,因為我們將對客户端進行安全保護。
4.2. 客户端配置
一旦我們擁有了Admin Server,就需要將我們的應用程序配置為客户端。
首先,讓我們為 spring-boot-admin-starter-client 添加Maven依賴:
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>3.1.5</version>
</dependency>我們還需要在管理服務器和客户端之間建立安全保障,因此我們引入了 Spring Boot Security starter:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>3.1.5</version>
</dependency>接下來,我們需要在我們的 application.properties 文件中進行一些配置更改。
管理服務器在 8080 端口上運行,因此首先我們更改端口併為應用程序指定一個名稱:
spring.application.name=spring-boot-management
server.port=8081現在,讓我們添加配置以訪問服務器:
spring.security.user.name=client
spring.security.user.password=client
spring.boot.admin.client.url=http://localhost:8080
spring.boot.admin.client.username=admin
spring.boot.admin.client.password=admin
spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name}
spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}這包括管理服務器運行的 URL 以及客户端和管理服務器的登錄信息。
最後,我們需要為管理服務器啓用 /health、/info 和/metrics 端點,以便管理服務器能夠確定客户端的狀態:
management.endpoints.web.exposure.include=httptrace,loggers,health,info,metrics因為更改日誌級別是 POST 操作,因此還需要添加一些安全配置以忽略 actuator 端點的 CSRF 保護:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/actuator/**");
}4.3. 使用 Spring Boot Admin
配置完成後,讓我們使用 `mvn spring-boot:run 命令啓動客户端和服務器應用程序。
首先,讓我們訪問我們的日誌 API,網址為 http://localhost:8081/log,不進行任何更改。 鑑於現在啓用了安全功能,您將被要求使用我們在 application.properties 中指定的憑據進行登錄。
我們的日誌輸出應顯示反映 INFO 日誌級別的信息。
09:13:23.416 [http-nio-8081-exec-10] INFO c.b.s.b.m.logging.LoggingController - This is an INFO level message
09:13:23.416 [http-nio-8081-exec-10] WARN c.b.s.b.m.logging.LoggingController - This is a WARN level message
09:13:23.416 [http-nio-8081-exec-10] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message現在,讓我們登錄 Spring Boot Admin 服務器並更改我們的日誌級別。請前往 http://localhost:8080,並使用管理員憑據進行登錄。 我們將被帶到已註冊應用程序的列表,其中我們應該看到我們的 spring-boot-management 應用程序:
請選擇 spring-boot-management 並使用左側菜單查看日誌記錄器:
com.baeldung.spring.boot.management.logging 日誌記錄器設置為 INFO。 讓我們將其更改為 TRACE 並重新運行我們的日誌 API:
10:13:56.376 [http-nio-8081-exec-4] TRACE c.b.s.b.m.logging.LoggingController - This is a TRACE level message
10:13:56.376 [http-nio-8081-exec-4] DEBUG c.b.s.b.m.logging.LoggingController - This is a DEBUG level message
10:13:56.376 [http-nio-8081-exec-4] INFO c.b.s.b.m.logging.LoggingController - This is an INFO level message
10:13:56.376 [http-nio-8081-exec-4] WARN c.b.s.b.m.logging.LoggingController - This is a WARN level message
10:13:56.376 [http-nio-8081-exec-4] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message5. LoggingSystem
LoggingSystem 是 Spring Boot 應用程序中提供的 Spring 組件,它提供日誌功能。默認情況下,它使用 Logback 作為日誌系統,但可以輕鬆配置為使用其他日誌系統,例如 Log4j2 或 Java Util Logging。
現在,讓我們創建一個簡單的端點,並調用 setLogLevel() 以在運行時更改應用程序的日誌級別:
@GetMapping("/change-to-error")
public String changeLogLevelToError() {
LoggingSystem system = LoggingSystem.get(LoggingController.class.getClassLoader());
system.setLogLevel(LoggingController.class.getName(), LogLevel.ERROR);
return "changed log level to error";
}6. 結論
在本文中,我們探討了在運行時控制日誌級別的不同方法。我們首先使用了內置的 Actuator 功能。隨後,我們使用了 Logback 的自動掃描功能。此外,我們還學習瞭如何使用 Spring Boot Admin 監控和更改註冊客户端應用程序中的日誌級別。最後,我們使用了 <em >LoggingSystem</em> 來在運行時更改日誌級別。