Spring Bootアプリケーションのランタイムでのログレベルの変更

1. 前書き

このチュートリアルでは、実行時にSpring Bootアプリケーションのログレベルを変更する方法を見ていきます。 多くのことと同様に、https://www.baeldung.com/spring-boot-logging [Spring Bootには組み込みのロギング機能]が設定されています。 実行中のアプリケーションのログレベルを調整する方法を検討します。
それを行う3つの方法を見ていきます:link:/spring-boot-actuators[Spring Boot Actuator]ロガーエンドポイントを使用する、https://www.baeldungの自動スキャン機能。 com / logback [Logback]そして最後にlink:/spring-boot-admin[Spring Boot Admin]ツールを使用します。

2. スプリングブートアクチュエータ

/ _loggers_ Actuatorエンドポイントを使用して、ログレベルを表示および変更することから始めます。 * / _ loggers_エンドポイントは_actuator / loggers_で利用でき、パスの一部として名前を追加することで特定のロガーにアクセスできます。*
たとえば、http:// localhost:8080 / actuator / loggers / root [_http:// localhost:8080 / actuator / loggers / root_]というURLでルートロガーにアクセスできます。

2.1. セットアップ

Spring Boot Actuatorを使用するようにアプリケーションを設定することから始めましょう。
まず、https://search.maven.org/search?q = spring-boot-starter-actuator [Spring Boot Actuator Mavenの依存関係]を_pom.xml_ファイルに追加する必要があります。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>2.1.8.RELEASE</version>
</dependency>
  • Spring Boot 2.x以降、ほとんどのエンドポイントはデフォルトで無効になっているため、_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
次に、ログを確認して、3つのロギングステートメントを見つけます。
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"}
ロギングレベルを変更するには、__ OST_リクエストを/ _loggers_エンドポイントに発行できます。
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 message

3. ログバック自動スキャン

*デフォルトでは、Spring BootアプリケーションはLogbackロギングライブラリを使用しています。* Logbackの自動スキャン機能を利用してロギングレベルを変更する方法を見てみましょう。
まず、_src / main / resources_ディレクトリの下に_logback.xml_という名前のファイルを配置して、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
それでは、_logback.xml_の_com.baeldung.spring.boot.management.logging_ロガーを_TRACE_に変更しましょう。
<logger name="com.baeldung.spring.boot.management.logging" level="TRACE" />
15秒待ってから、http:// localhost:8080 / log [_http:// localhost:8080 / log_]でログAPIを再実行し、ログ出力を確認しましょう。
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 message

4. Spring Boot Admin

ログレベルを変更する3番目の方法は、Spring Boot Adminツールを使用することです。 * Spring Boot Adminを使用するには、サーバーアプリケーションを作成し、アプリケーションをクライアントとして構成する必要があります。*

4.1. 管理アプリケーション

Spring Boot Adminでログレベルを変更するには、管理サーバーとして使用する新しいアプリケーションを設定する必要があります。 そのためにhttps://start.spring.io/[Spring Initialzr]を使用できます。
最新のhttps://search.maven.org/search?q=spring-boot-admin-starter-server[_spring-boot-admin-starter-server_]をpom.xmlに追加しましょう。
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.1.6</version>
</dependency>
管理サーバーのセットアップの詳細な手順については、https://www.baeldung.com/spring-boot-admin [Spring Boot Adminのガイド]のセクション2をご覧ください。 また、セクション4には、クライアントを保護するため、セキュリティの設定に必要な情報が含まれています。

4.2. クライアント設定

管理サーバーを作成したら、アプリケーションをクライアントとして設定する必要があります。
まず、_https://search.maven.org/search?q = spring-boot-admin-starter-client [spring-boot-admin-starter-client] _のMaven依存関係を追加しましょう。
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.1.6</version>
</dependency>
また、管理サーバーとクライアント間のセキュリティが必要になるため、https://search.maven.org/search?q = spring-boot-starter-security [Spring Boot Security starter]を導入しましょう。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.1.8.RELEASE</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操作であるため、アクチュエータエンドポイントのCSRF保護を無視するために、少しセキュリティ設定を追加する必要があります。
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().ignoringAntMatchers("/actuator/**");
}

4.3. Spring Boot Adminの使用

設定が終わったら、_mvn spring-boot:run_を使用してクライアントアプリケーションとサーバーアプリケーションの両方を起動しましょう。
何も変更せずにhttp:// localhost:8081 / log [_http:// localhost:8081 / log_]のログAPIにアクセスすることから始めましょう。 これでセキュリティが有効になったので、_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_アプリケーションが表示される登録済みアプリケーションのリストに移動します。
link:/uploads/admin_application_list-100x34.jpg%20100w []
_spring-boot-management_を選択し、左側のメニューを使用してロガーを表示しましょう。
link:/uploads/admin_app_loggers_default-100x48.jpg%20100w []
_com.baeldung.spring.boot.management.logging_ロガーはINFOに設定されます。 TRACEに変更して、ログAPIを再実行してみましょう。
link:/uploads/admin_app_loggers_trace-100x50.jpg%20100w []
これで、ログ出力に新しいロガーレベルが反映されます。
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 message

5. 結論

この記事では、実行時にログレベルを制御するさまざまな方法を検討しました。 組み込みのアクチュエーター機能の使用を開始しました。 その後、Logbackの自動スキャン機能を使用しました。
最後に、Spring Boot Adminを使用して、登録済みクライアントアプリケーションのログレベルを監視および変更する方法を学びました。
https://github.com/eugenp/tutorials/tree/master/spring-boot-management [アクチュエーターとログバックを使用]およびhttps://github.com/eugenp/tutorials/tree/masterをセットアップするためのサンプルコード/ spring-boot-admin [Spring Boot Admin]は両方ともGitHubで利用できます。