1.11. 他のロギング API を使用する
Red Hat build of Quarkus は、すべてのロギング要件に関して JBoss Logging ライブラリーに依存しています。
Apache Commons Logging、Log4j、SLF4J などの他のロギングライブラリーに依存するライブラリーを使用すると想定します。その場合は、それらを依存関係から除外し、いずれかの JBoss Logging アダプターを使用します。
ネイティブ実行可能ファイルのコンパイル時に以下のような問題が発生する可能性があるため、これはネイティブ実行可能ファイルをビルドする場合に特に重要です。
Caused by java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl
ロギングの実装はネイティブ実行可能ファイルに含まれませんが、JBoss Logging アダプターを使用してこの問題を解決できます。
次の章で説明するように、これらのアダプターは一般的なオープンソースのロギングコンポーネントで利用できます。
1.11.1. アプリケーションにロギングアダプターを追加する
jboss-logging
以外の各ロギング API では、以下を実行します。
ロギングアダプターライブラリーを追加して、これらの API 経由でログに記録されたメッセージが JBoss Log Manager バックエンドにルーティングされるようにします。
注記この手順は、エクステンションが自動的に処理する Quarkus エクステンションの依存関係であるライブラリーには不要です。
Apache Commons Logging:
Maven を使用:
<dependency> <groupId>org.jboss.logging</groupId> <artifactId>commons-logging-jboss-logging</artifactId> </dependency>
Gradle を使用する場合:
implementation("org.jboss.logging:commons-logging-jboss-logging")
Log4j:
Maven を使用:
<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j-jboss-logmanager</artifactId> </dependency>
Gradle を使用する場合:
implementation("org.jboss.logmanager:log4j-jboss-logmanager")
Log4j 2:
Maven を使用:
<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j2-jboss-logmanager</artifactId> </dependency>
Gradle を使用する場合:
implementation("org.jboss.logmanager:log4j2-jboss-logmanager")
注記log4j2-jboss-logmanager
ライブラリーには、Log4j をロギング実装として使用するために必要なものがすべて含まれているため、Log4j の依存関係を含めないでください。
SLF4J:
Maven を使用:
<dependency> <groupId>org.jboss.slf4j</groupId> <artifactId>slf4j-jboss-logmanager</artifactId> </dependency>
Gradle を使用する場合:
implementation("org.jboss.slf4j:slf4j-jboss-logmanager")
- 追加されたライブラリーが生成したログが、他の Quarkus ログと同じフォーマットになっているか確認します。
1.11.2. MDC を使用してコンテキストログ情報を追加する
Quarkus は、リアクティブコアとの互換性を高めるために、ロギングの Mapped Diagnostic Context (MDC) をオーバーライドします。
1.11.2.1. MDC データの追加と読み取り
MDC にデータを追加し、ログ出力で展開するには以下を実行します。
MDC
クラスを使用してデータを設定します。-
import org.jboss.logmanager.MDC;
を追加します。 以下の例に示すように、
MDC.put(…)
を設定します。JBoss Logging と
io.quarkus.logging.Log
の例package me.sample; import io.quarkus.logging.Log; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import org.jboss.logmanager.MDC; import java.util.UUID; @Path("/hello/jboss") public class GreetingResourceJbossLogging { @GET @Path("/test") public String greeting() { MDC.put("request.id", UUID.randomUUID().toString()); MDC.put("request.path", "/hello/test"); Log.info("request received"); return "hello world!"; } }
-
%X{mdc-key}
を使用するようにログフォーマットを設定します。quarkus.log.console.format=%d{HH:mm:ss} %-5p request.id=%X{request.id} request.path=%X{request.path} [%c{2.}] (%t) %s%n
結果のメッセージには MDC データが含まれます。
08:48:13 INFO request.id=c37a3a36-b7f6-4492-83a1-de41dbc26fe2 request.path=/hello/test [me.sa.GreetingResourceJbossLogging] (executor-thread-1) request received
1.11.2.2. MDC とサポートされるロギング API
ロギング API に応じて、次のいずれかの MDC クラスを使用します。
-
Log4j 1 -
org.apache.log4j.MDC.put(key, value)
-
Log4j 2 -
org.apache.logging.log4j.ThreadContext.put(key, value)
-
SLF4J -
org.slf4j.MDC.put(key, value)
1.11.2.3. MDC の伝播
Quarkus では、MDC プロバイダーにはリアクティブコンテキストを処理するための特定の実装があるため、MDC データはリアクティブな非同期処理中に確実に伝播されます。
その結果、さまざまなシナリオで引き続き MDC データにアクセスできます。
- 非同期呼び出しの後、たとえば REST クライアントが Uni を返した場合。
-
org.eclipse.microprofile.context.ManagedExecutor
. に送信されたコード内にて。 -
vertx.executeBlocking()
で実行されるコード内にて。
該当する場合、MDC データは 複製されたコンテキスト に保存されます。これは、単一のタスクまたはリクエストを処理するための分離されたコンテキストです。