Quarkus を使用したロギングの設定
はじめに
アプリケーション開発者は、ロギングを使用して、アプリケーションの実行中に発生するイベントに関するメッセージを表示および記録できます。ログメッセージは、開発およびテスト中にアプリケーションをデバッグしたり、実稼働環境でアプリケーションを監視したりするために使用できる情報を提供します。
前提条件
OpenJDK (JDK) 11 がインストールされ、
JAVA_HOME
環境変数が Java SDK の場所を指定するように設定されている。- Red Hat ビルドの Open JDK は、Red Hat カスタマーポータルの Software Downloads ページからダウンロードできます (ログインが必要です)。
Apache Maven 3.6.2 以降がインストールされている。
- Maven は Apache Maven Project の Web サイトからダウンロードできます。
Quarkus Maven プロジェクトがある。
- Maven を使用した Quarkus アプリケーションの作成方法に関する詳細は、Apache Maven を使用した Quarkus アプリケーションの開発およびコンパイル を参照してください。
Red Hat ドキュメントへのフィードバック (英語のみ)
弊社の技術的な内容についてのフィードバックに感謝します。ご意見をお聞かせください。コメントの追加、Insights の提供、誤字の修正、および質問を行う必要がある場合は、ドキュメントで直接行うこともできます。
Red Hat アカウントがあり、カスタマーポータルにログインしている必要があります。
カスタマーポータルからドキュメントのフィードバックを送信するには、以下の手順を実施します。
- Multi-page HTML 形式を選択します。
- ドキュメントの右上にある Feedback ボタンをクリックします。
- フィードバックを提供するテキストのセクションを強調表示します。
- ハイライトされたテキストの横にある Add Feedback ダイアログをクリックします。
- ページの右側のテキストボックスにフィードバックを入力し、Submit をクリックします。
フィードバックを送信すると、自動的に問題の追跡が作成されます。Submit をクリックすると表示されるリンクを開き、問題の監視を開始するか、さらにコメントを追加します。
貴重なフィードバックにご協力いただきありがとうございます。
多様性を受け入れるオープンソースの強化
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ をご覧ください。
第1章 JBoss LogManager およびサポートされているロギングフレームワーク
Quarkus は JBoss LogManager ロギングバックエンドを使用して、ログデータを収集および管理します。JBoss Logging を使用して、Quarkus 内部イベントおよびアプリケーション内のイベントに関するデータを収集できます。application.properties
ファイルにロギングの動作を設定できます。
JBoss LogManager は、JBoss Logging に加えて、いくつかのサードパーティーのロギング API をサポートします。JBoss LogManager は、サポートされるすべてのロギング API からのログをマージします。
ロギング用にサポートされている API:
Quarkus は、JBoss Logging を使用してすべてのロギング機能を処理します。別のロギング API に依存するライブラリーを使用する場合は、このライブラリーを依存関係から除外し、JBoss Logging を設定してサードパーティー API のロギングアダプターを使用する必要があります。
1.1. Apache Log4j ロギングフレームワークの追加
Apache Log4j は、ロギングバックエンドとロギング API を含むロギングフレームワークです。Quarkus は JBoss LogManager バックエンドを使用するため、log4j2-jboss-logmanager
ライブラリーをプロジェクトに追加し、ロギング API として Log4j を使用できます。Log4j ライブラリーを追加すると、Log4j ログが JBoss Log Manager にルーティングされます。Log4j の依存関係を含める必要はありません。
手順
-
log4j2-jboss-logmanager
ライブラリーをプロジェクトのpom.xml
ファイルの依存関係として追加します。
pom.xml
<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j2-jboss-logmanager</artifactId> </dependency>
log4j2-jboss-logmanager
は Log4J バージョン 2 API のライブラリーです。レガシーの Log4J バージョン 1 API を使用する場合は、代わりに log4j-jboss-logmanager
を追加する必要があります。
関連情報
1.2. ロギングアダプターの使用
Quarkus は、すべてのロギング要件に関して JBoss Logging ライブラリーに依存します。
Apache Commons Logging、Log4j、SLF4j などの他のロギングライブラリーの依存関係を持つライブラリーを使用している場合は、これらのロギングライブラリーを依存関係から除外し、JBoss Logging が提供するアダプターのいずれかを使用する必要があります。Quarkus エクステンションの依存関係であるライブラリー用のアダプターを追加する必要はありません。
サードパーティーのロギングの実装は、ネイティブの実行可能ファイルに含まれていないため、アプリケーションがコンパイルに失敗し、次のようなエラーメッセージが表示される場合があります。
Caused by java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl
使用するサードパーティーのロギング実装用に JBoss Logging アダプターを設定することで、このエラーを防ぐことができます。
手順
使用しているロギングライブラリーに応じて、アダプターのいずれかを
pom.xml
ファイルに追加します。Apache Commons Logging:
pom.xml
<dependency> <groupId>org.jboss.logging</groupId> <artifactId>commons-logging-jboss-logging</artifactId> </dependency>
Log4j:
pom.xml
<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j-jboss-logmanager</artifactId> </dependency>
Log4j2:
pom.xml
<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j2-jboss-logmanager</artifactId> </dependency>
SLF4j:
pom.xml
<dependency> <groupId>org.jboss.slf4j</groupId> <artifactId>slf4j-jboss-logmanager</artifactId> </dependency>
第2章 アプリケーションの JBoss Logging を有効にする
JBoss Logging を使用してアプリケーションログを収集する場合は、ログを生成する各クラスにロガーを追加する必要があります。次の手順は、API アプローチを使用してプログラムで、またはアノテーションを使用して宣言的に、アプリケーションにロギングを追加する方法を示しています。
手順
アプリケーションコードに応じて、次のいずれかの方法を使用します。
org.jboss.logging.Logger
のインスタンスを作成し、各クラスの静的メソッドLogger.getLogger(Class)
を呼び出して初期化します。src/main/java/org/acme/ExampleResource.java
import org.jboss.logging.Logger; 1 import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/hello") public class ExampleResource { private static final Logger LOG = Logger.getLogger(ExampleResource.class); 2 @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { LOG.info("Hello"); 3 return "hello"; } }
bean およびリソースクラスに、設定した
org.jboss.logging.Logger
インスタンスを注入します。src/main/java/org/acme/ExampleResource.java
import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.jboss.logging.Logger; 1 import io.quarkus.arc.log.LoggerName; @Path("/hello") public class ExampleResource { @Inject Logger log; 2 @LoggerName("foo") Logger fooLog; 3 @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { log.info("Simple!"); fooLog.info("Goes to foo logger!"); return "hello"; } }
注記ロガーインスタンスは内部的にキャッシュされます。Bean に注入するロガーは、すべての Bean インスタンスで共有され、ロガーのインスタンス化に関連するパフォーマンスの低下を回避します。
(オプション)
application.properties
ファイルでロギング出力を設定します。src/main/resources/application.properties
<configuration_key>=<value>
たとえば、ログファイルを作成し、出力結果をコンソールとファイルに出力できます。
src/main/resources/application.properties
quarkus.log.file.enable=true quarkus.log.file.path=/tmp/trace.log
アプリケーションを開発モードで実行します。
./mvnw quarkus:dev
-
http://localhost:8080/hello
を参照します。 設定に応じて、端末またはログファイルでログメッセージを確認します。
ロギングレベルが
INFO に
設定されたExampleResource.class
の出力例:2021-05-21 15:38:39,751 INFO [io.quarkus] (Quarkus Main Thread) my-project my-version on JVM (powered by Quarkus 1.13.3.Final) started in 1.189s. Listening on: http://localhost:8080 2021-05-21 15:38:39,765 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. 2021-05-21 15:38:39,766 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy] 2021-05-21 15:38:58,790 INFO [ExampleResource] (executor-thread-1) Hello
関連情報
第3章 ランタイム設定の設定
application.properties
ファイルで、ロギングレベルおよびロギングカテゴリーを設定できます。
ロギングカテゴリーは階層的です。カテゴリーのロギングレベルを設定すると、設定はそのカテゴリーのすべてのサブカテゴリーに適用されます。
ロギングレベル設定には、ロギングレベルと最小ロギングレベルの 2 つがあります。デフォルトのロギングレベルは INFO
で、デフォルトの最小ロギングレベルは DEBUG
です。quarkus.log.level
および quarkus.log.min-level
プロパティーまたはカテゴリーを使用して、グローバルで調整できます。
ロギングレベルを最小ロギングレベルより低く設定する場合は、最小ロギングレベルも調整する必要があります。そうしないと、最小ロギングレベルの値がロギングレベルをオーバーライドします。
過度のロギングは、パフォーマンスに影響を与えます。最小ロギングレベルを調整して、アプリケーションに関連するデータのみを収集できます。ログボリュームを減らすと、メモリー使用量が最適化され、アプリケーションのパフォーマンスが向上する可能性があります。たとえば、ネイティブ実行では、最小レベルにより、低いレベルのチェック (isTraceEnabled
) を false
に折りたたむことができます。これにより、デッドコードが削除されます。
手順
application.properties
ファイルでロギング出力を設定します。src/main/resources/application.properties
<configuration_key>=<value>
以下の例は、デフォルトのロギングレベルを
INFO
ロギングに設定し、HibernateDEBUG
ログを含める方法を示しています。src/main/resources/application.properties
quarkus.log.level=INFO quarkus.log.category."org.hibernate".level=DEBUG
注記コマンドラインで設定プロパティーを設定する場合は、
"
をエスケープしてください。たとえば、-Dquarkus.log.category.\"org.hibernate\".level=TRACE
です。
3.1. ロギング形式の設定
Quarkus は、人間が判読できるテキストログを生成するパターンベースのロギングフォーマッターを使用します。ログエントリーには、タイムスタンプ、ロギングレベル、クラス名、スレッド ID、およびメッセージが表示されます。専用の設定プロパティーを使用して、各ログハンドラーの形式をカスタマイズできます。
前提条件
- Quarkus Maven プロジェクトがある。
手順
quarkus.log.console.format
の値を設定して、コンソールハンドラーを設定します。src/main/resources/application.properties
quarkus.log.console.format=<logging_format_string>
src/main/resources/application.properties
quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n
この設定により、ログメッセージのフォーマットは以下のようになります。
14:11:07 INFO [ExampleResource] (executor-thread-199) Hello
関連情報
3.1.1. ロギング形式の文字列
次の表に、ログメッセージの形式を設定するために使用できるロギング形式の文字列記号を示します。
Symbol | 概要 | 説明 |
---|---|---|
|
|
単純な |
| カテゴリー | カテゴリー名 |
| ソースクラス | ソースクラス名[a] |
| 日付 |
|
| 例外 | 例外スタックトレース |
| ソースファイル | ソースファイル名 [a] |
| ホスト名 | システムのシンプルなホスト名 |
| 修飾ホスト名 | システムの完全修飾ホスト名。OS の設定によっては、シンプルなホスト名と同じになる場合があります。 |
| プロセス ID | 現在のプロセス PID |
| ソースの場所 | ソースの場所 (ソースファイル名、行番号、クラス名、およびメソッド名) [a] |
| ソース行 | ソース行番号 [a] |
| フルメッセージ | ログメッセージ (例外トレースを含む) |
| ソースメソッド | ソースメソッド名 [a] |
| 改行 | プラットフォーム固有の行区切り文字列 |
| プロセス名 | 現在のプロセスの名前 |
| レベル | メッセージのロギングレベル |
| 相対時間 | アプリケーションログの開始からの相対時間 (ミリ秒単位) |
| シンプルなメッセージ | 例外トレースのないログメッセージ |
| スレッド名 | スレッド名 |
| スレッド ID | スレッド ID |
| タイムゾーン |
|
| マップされた診断コンテキスト値 | マップされた診断コンテキストからの値 |
| マップされた診断コンテキスト値 | {property.key=property.value} 形式のマップされた診断コンテキストからのすべての値 |
| ネスト化された診断コンテキスト値 | ネスト化された診断コンテキストからのすべての値 ({value1.value2} の形式) |
[a]
呼び出し元情報を調べるフォーマットシーケンスは、パフォーマンスに影響を与える可能性があります。
|
3.2. ロギングカテゴリーの設定
ロギングカテゴリーを使用して、ログメッセージを重大度または属するコンポーネントに基づいて整理できます。各カテゴリーを個別に設定できます。
すべてのカテゴリーで、同じ設定がコンソール、ファイル、および syslog に適用されます。1 つ以上の名前付きハンドラーをカテゴリーにアタッチすることで、設定をオーバーライドできます。
プロパティー名 | デフォルト | 説明 |
---|---|---|
|
|
|
|
|
|
|
| ロガーがその出力を親ロガーに送信できるようにします。 |
|
| 特定のカテゴリーにアタッチするハンドラーの名前。 |
[a]
一部のエクステンションでは、特定のカテゴリーに対してカスタマイズされたデフォルトのロギングレベルを定義して、ログノイズを減らします。設定でロギングレベルを設定すると、エクステンションで定義されたロギングレベルがオーバーライドされます。
[b]
デフォルトでは、設定されたカテゴリーは、root ロガーカテゴリーからアタッチされたすべてのハンドラーを継承します。
|
プロパティーの名前でロギングカテゴリー名を使用する場合、通常はカテゴリー名の一部であるピリオド (.
) をエスケープするために、ログカテゴリー名を二重引用符 ("
) で囲む必要があります。
3.3. ロギングレベル
ロギングレベルを使用して、重大度または Quarkus アプリケーションの正常性と安定性への影響によって、ログを分類することができます。ロギングレベルを使用すると、純粋に情報を示すイベントから重要なイベントをフィルタリングできます。
ロギングレベル | 説明 |
---|---|
OFF | ロギングをオフにする特別なレベル。 |
FATAL | 重大なサービス障害またはサービス要求を完了できない。 |
ERROR | 要求の大幅な中断または要求に対応できない。 |
WARN | 重大ではないサービスエラーまたは即時の修正を必要としない可能性がある問題。 |
INFO | サービスライフサイクルイベントまたは重要な関連する非常に低頻度の情報。 |
DEBUG | デバッグに役立つ可能性がある、ライフサイクルまたは要求にバインドされていないイベントに関する追加情報を伝えるメッセージ。 |
TRACE | 非常に頻繁に発生する可能性のある追加の要求ごとのデバッグ情報を伝えるメッセージ。 |
ALL | カスタムレベルを含むすべてのメッセージの特別なレベル。 |
また、java.util.logging
パッケージによって記述されるロギングレベル名を使用することもできます。
3.4. root ロガー設定
root ロガーカテゴリーは、ロガー階層の最上位にあります。root ロガーは、サーバーに送信され、ロギングカテゴリーによってキャプチャーされない、指定されたロギングレベル以上のすべてのログメッセージをキャプチャーします。root ロガーカテゴリーは、ロギング設定の最上位で設定されます。
プロパティー名 | デフォルト | 説明 |
---|---|---|
|
| すべてのロギングカテゴリーのデフォルトのロギングレベル。 |
|
| すべてのロギングカテゴリーのデフォルトの最小ロギングレベル。 |
3.5. Quarkus ログハンドラー
ログハンドラーは、ログイベントを受信者に送信するロギングコンポーネントです。Quarkus には、次のログハンドラーが含まれています。
- Console ログハンドラー
-
コンソールログハンドラーはデフォルトで有効になっています。アプリケーションのコンソール (通常はシステムの
stdout
) にすべてのログイベントを出力します。 - File ログハンドラー
- ファイルログハンドラーはデフォルトで無効になっています。すべてのログイベントをアプリケーションのホスト上のファイルに出力します。ファイルログハンドラーは、ログファイルのローテーションをサポートしています。
- Syslog ログハンドラー
- Syslog は、Unix 系システムでログメッセージを送信するプロトコルです。syslog プロトコルの仕様は、RFC 5424 で定義されています。
syslog ハンドラーは、すべてのログイベントを syslog サーバーに送信します (デフォルトでは、syslog サーバーはアプリケーションと同じホストで実行されます)。デフォルトでは、syslog ハンドラーは無効になっています。
3.6. ロギング設定の例
このセクションでは、Quarkus プロジェクトのロギングを設定する方法の例を示します。
src/main/resources/application.properties
# Format log messages to have shorter time and shorter category prefixes. quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n # Remove color from log messages. quarkus.log.console.color=false # Enable console DEBUG logging with the exception of Quarkus logs that have a logging level set to INFO. quarkus.log.console.level=DEBUG quarkus.log.category."io.quarkus".level=INFO
src/main/resources/application.properties
# Enable file logging and set a path to the log file. quarkus.log.file.enable=true quarkus.log.file.path=/tmp/trace.log # Enable TRACE log messages in a log file. quarkus.log.file.level=TRACE # Set a format for the log file output. quarkus.log.file.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n # Set logging level to TRACE for specific categories. quarkus.log.category."io.quarkus.smallrye.jwt".level=TRACE quarkus.log.category."io.undertow.request.security".level=TRACE
デフォルトでは、root ロガーレベルは INFO
に設定されています。DEBUG
または TRACE
などの低いレベルのログを収集する場合は、root ロガーの設定を変更する必要があります。
src/main/resources/application.properties
# Set path to the log file. quarkus.log.file.path=/tmp/trace.log # Configure console format. quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%n # Configure a console log handler. quarkus.log.handler.console."STRUCTURED_LOGGING".format=%e%n # Configure a file log handler. quarkus.log.handler.file."STRUCTURED_LOGGING_FILE".enable=true quarkus.log.handler.file."STRUCTURED_LOGGING_FILE".format=%e%n # Configure the category and associate it with the two named handlers. quarkus.log.category."io.quarkus.category".level=INFO quarkus.log.category."io.quarkus.category".handlers=STRUCTURED_LOGGING,STRUCTURED_LOGGING_FILE
第4章 JSON ロギング形式の設定
コンソールログの出力形式を JSON に変更して、後で分析するためにログ情報を処理および保存しやすくすることができます。
JSON ロギング形式を設定するには、quarkus-logging-json
エクステンションを Quarkus プロジェクトに追加する必要があります。コンソール設定の出力形式設定を quarkus-logging-json
エクステンションに置き換えます。フォーマット文字列や色設定などのコンソール設定項目は無視されます。非同期ロギングやロギングレベルを制御するものなど、その他のコンソール設定項目は引き続き適用されます。
手順
quarkus-logging-json
エクステンションをアプリケーションのpom.xml
ファイルに追加します。pom.xml
<dependencies> <!-- ... your other dependencies are here ... --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-logging-json</artifactId> </dependency> </dependencies>
(オプション)
application.properties
ファイルの JSON ロギング用のプロファイル固有の設定を行います。src/main/resources/application.properties
%<profile>.<configuration_key>=<value>
次の例は、開発プロファイルとテストプロファイルの JSON ロギングを無効にする方法を示しています。
src/main/resources/application.properties
%dev.quarkus.log.console.json=false %test.quarkus.log.console.json=false
4.1. JSON ロギング設定プロパティー
次の設定プロパティーを使用して、JSON ロギングエクステンションを設定できます。
設定プロパティー | 説明 | 型 | デフォルト |
---|---|---|---|
| JSON コンソールのフォーマットエクステンションを有効にします。 | boolean |
|
| JSON レコードのプリティープリントを有効にします。[a] | boolean |
|
|
日付の形式。 | string |
|
| 特別な記録終了区切り文字。デフォルトでは、改行が区切り文字として使用されます。 | string | |
|
ゾーンの ID。 | string |
|
| 例外の出力タイプ。 |
|
|
| ログの詳細な出力を有効にします。詳細には、ソースクラス名、ソースファイル名、ソースメソッド名、およびソース行番号が含まれます。[b] | boolean |
|
[a]
一部のプロセッサーと JSON パーサーは、プリティープリントの出力を読み取れない場合があります。
[b]
値は呼び出し元から取得されるため、詳細の出力はリソースを多く使用する可能性があります。
|
第5章 @QuarkusTest
のロギング設定
@QuarkusTest
のロギングを設定する場合は、それに応じて maven-surefire-plugin
を設定する必要があります。java.util.logging.manager
システムプロパティーを使用して LogManager
を指定する必要があります。
手順
java.util.logging.manager
システムプロパティーを使用してLogManager
を設定します。pom.xml
<build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>${surefire-plugin.version}</version> <configuration> <systemPropertyVariables> <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> 1 <quarkus.log.level>DEBUG</quarkus.log.level> 2 <maven.home>${maven.home}</maven.home> </systemPropertyVariables> </configuration> </plugin> </plugins> </build>
第6章 関連情報
改訂日時: 2023-05-16