Quarkus を使用したロギングの設定
第1章 Quarkus を使用したロギングの設定 リンクのコピーリンクがクリップボードにコピーされました!
アプリケーション開発者は、ロギングを使用して、アプリケーションの実行中に発生するイベントに関するメッセージを表示および記録できます。ログメッセージは、開発およびテスト中にアプリケーションをデバッグしたり、実稼働環境でアプリケーションを監視したりするために使用できる情報を提供します。
前提条件
OpenJDK 11 または 17 をインストールし、
JAVA_HOME環境変数を設定して Java SDK の場所を指定している。- Red Hat OpenJDK をダウンロードするには、Red Hat カスタマーポータル にログインし、ソフトウェアのダウンロード に 移動します。
Apache Maven 3.8.x がインストールされている。x は 6 以降です。
- Maven は Apache Maven Project の Web サイトからダウンロードできます。
Quarkus Maven プロジェクトを作成している。
- Maven を使用した Quarkus アプリケーションの作成方法に関する詳細は、Apache Maven を使用した Quarkus アプリケーションの開発およびコンパイル を参照してください。
多様性を受け入れるオープンソースの強化 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。まずは、マスター (master)、スレーブ (slave)、ブラックリスト (blacklist)、ホワイトリスト (whitelist) の 4 つの用語の置き換えから始めます。この取り組みは膨大な作業を要するため、今後の複数のリリースで段階的に用語の置き換えを実施して参ります。詳細は、Red Hat CTO である Chris Wright のメッセージ をご覧ください。
1.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.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><dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j2-jboss-logmanager</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow log4j2-jboss-logmanagerは Log4J バージョン 2 API のライブラリーです。レガシーの Log4J バージョン 1 API を使用する場合は、代わりにlog4j-jboss-logmanagerを追加する必要があります。
1.1.2. ロギングアダプターの使用 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus は、すべてのロギング要件に関して JBoss Logging ライブラリーに依存します。
Apache Commons Logging、Log4j、SLF4j などの他のロギングライブラリーの依存関係を持つライブラリーを使用する場合は、これらのロギングライブラリーを依存関係から除外し、JBoss Logging が提供するアダプターのいずれかを使用する必要があります。Quarkus エクステンションの依存関係であるライブラリー用のアダプターを追加する必要はありません。
サードパーティーのロギングの実装は、ネイティブの実行可能ファイルに含まれていないため、アプリケーションがコンパイルに失敗し、次のようなエラーメッセージが表示される場合があります。
Caused by java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl
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><dependency> <groupId>org.jboss.logging</groupId> <artifactId>commons-logging-jboss-logging</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Log4j:
pom.xmlファイルの例<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j-jboss-logmanager</artifactId> </dependency><dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j-jboss-logmanager</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Log4j2:
pom.xmlファイルの例<dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j2-jboss-logmanager</artifactId> </dependency><dependency> <groupId>org.jboss.logmanager</groupId> <artifactId>log4j2-jboss-logmanager</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow SLF4j:
pom.xmlファイルの例<dependency> <groupId>org.jboss.slf4j</groupId> <artifactId>slf4j-jboss-logmanager</artifactId> </dependency><dependency> <groupId>org.jboss.slf4j</groupId> <artifactId>slf4j-jboss-logmanager</artifactId> </dependency>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
1.2. アプリケーションの JBoss Logging を有効にする リンクのコピーリンクがクリップボードにコピーされました!
JBoss Logging を使用してアプリケーションログを収集する場合は、ログを生成する各クラスにロガーを追加する必要があります。
次の手順は、以下を使用してプログラムでアプリケーションにロギングを追加する方法を示しています。
- API アプローチ
- アノテーションの宣言的に使用
手順
アプリケーションコードに応じて、次のいずれかの方法を使用します。
org.jboss.logging.Loggerのインスタンスを作成し、各クラスの静的メソッドLogger.getLogger(Class)を呼び出して初期化します。ExampleResource.javaファイルCopy to Clipboard Copied! Toggle word wrap Toggle overflow bean およびリソースクラスに、設定した
org.jboss.logging.Loggerインスタンスを注入します。ExampleResource.javaファイルCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記ロガーインスタンスは内部的にキャッシュされます。Bean に注入するロガーは、すべての Bean インスタンスで共有され、ロガーのインスタンス化に関連するパフォーマンスの低下を回避します。
(オプション)
application.propertiesファイルでロギング出力を設定します。たとえば、ログファイルを作成し、出力結果をコンソールおよびファイルに出力できます。
application.propertiesファイルの例quarkus.log.file.enable=true quarkus.log.file.path=/tmp/trace.log
quarkus.log.file.enable=true quarkus.log.file.path=/tmp/trace.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow アプリケーションを開発モードで実行します。
アプリケーションを開発モードで実行
./mvnw quarkus:dev
./mvnw quarkus:devCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
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
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) HelloCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3. ランタイム設定の設定 リンクのコピーリンクがクリップボードにコピーされました!
application.properties ファイルで、ロギングレベルとカテゴリーを設定できます。
ロギングカテゴリーは階層的です。カテゴリーのロギングレベルを設定すると、設定はそのカテゴリーのすべてのサブカテゴリーに適用されます。
ロギングレベル設定には、ロギングレベルと最小ロギングレベルの 2 つがあります。デフォルトのロギングレベルは INFO で、デフォルトの最小ロギングレベルは DEBUG です。quarkus.log.level および quarkus.log.min-level プロパティーまたはカテゴリーを使用して、グローバルで調整できます。
ロギングレベルを最小ロギングレベルより低く設定する場合は、最小ロギングレベルも調整する必要があります。そうしないと、最小ロギングレベルの値がロギングレベルをオーバーライドします。
過度のロギングは、パフォーマンスに影響を与えます。最小ロギングレベルを調整して、アプリケーションに関連するデータのみを収集できます。ログボリュームを減らすと、メモリー使用量が最適化され、アプリケーションのパフォーマンスが向上する可能性があります。たとえば、ネイティブ実行では、最小レベルにより、低いレベルのチェック(isTraceEnabled)を false に折りたたむことができます。これにより、デッドコードが削除されます。
手順
application.propertiesファイルでロギング出力を設定します。以下の例は、デフォルトのロギングレベルを
INFOロギングに設定し、HibernateDEBUGログを含める方法を示しています。application.propertiesファイルの例quarkus.log.level=INFO quarkus.log.category."org.hibernate".level=DEBUG
quarkus.log.level=INFO quarkus.log.category."org.hibernate".level=DEBUGCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記コマンドラインを使用して設定プロパティーを設定する場合は、
"を使用してエスケープします。例
-
-Dquarkus.log.category.\"org.hibernate\".level=TRACE
-
1.3.1. ロギング形式の設定 リンクのコピーリンクがクリップボードにコピーされました!
Quarkus は、人間が判読できるテキストログを生成するパターンベースのロギングフォーマッターを使用します。ログエントリーには、タイムスタンプ、ロギングレベル、クラス名、スレッド ID、およびメッセージが表示されます。専用の設定プロパティーを使用して、各ログハンドラーの形式をカスタマイズできます。
前提条件
- Quarkus Maven プロジェクトがある。
手順
quarkus.log.console.formatの値を設定して、以下のようにコンソールハンドラーを設定します。application.propertiesファイルの例quarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%nquarkus.log.console.format=%d{HH:mm:ss} %-5p [%c{2.}] (%t) %s%e%nCopy to Clipboard Copied! Toggle word wrap Toggle overflow この設定により、ログメッセージのフォーマットは以下のようになります。
14:11:07 INFO [ExampleResource] (executor-thread-199) Hello
14:11:07 INFO [ExampleResource] (executor-thread-199) HelloCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.3.1.1. ロギング形式の文字列 リンクのコピーリンクがクリップボードにコピーされました!
次の表に、ログメッセージの形式を設定するために使用できるロギング形式の文字列記号を示します。
| 記号 | 概要 | 説明 |
|---|---|---|
|
|
|
単純な |
|
| カテゴリー | カテゴリー名 |
|
| ソースクラス | ソースクラス名 [a] |
|
| 日付 |
|
|
| 例外 | 例外スタックトレース |
|
| ソースファイル | ソースファイル名 [a] |
|
| ホスト名 | システムのシンプルなホスト名 |
|
| 修飾ホスト名 | システムの完全修飾ホスト名。OS の設定によっては、単純なホスト名と同じになる場合があります。 |
|
| プロセス ID | 現在のプロセス PID |
|
| ソースの場所 | ソースの場所 (ソースファイル名、行番号、クラス名、およびメソッド名) [a] |
|
| ソース行 | ソース行番号 [a] |
|
| フルメッセージ | ログメッセージ (例外トレースを含む) |
|
| ソースメソッド | ソースメソッド名 [a] |
|
| 改行 | プラットフォーム固有の行区切り文字列 |
|
| プロセス名 | 現在のプロセスの名前 |
|
| レベル | メッセージのロギングレベル |
|
| 相対時間 | アプリケーションログの開始からの相対時間 (ミリ秒単位) |
|
| シンプルなメッセージ | 例外トレースのないログメッセージ |
|
| スレッド名 | スレッド名 |
|
| スレッド ID | スレッド ID |
|
| タイムゾーン |
<zone |
|
| マップされた診断コンテキスト値 | マップされた診断コンテキストからの値 |
|
| マップされた診断コンテキスト値 | {property.key=property.value} 形式のマップされた診断コンテキストからのすべての値 |
|
| ネスト化された診断コンテキスト値 | {value1.value2} 形式のネスト化された診断コンテキストからのすべての値 |
[a]
呼び出し元情報を調べるフォーマットシーケンスは、パフォーマンスに影響を与える可能性があります。
| ||
1.3.2. ロギングカテゴリーの設定 リンクのコピーリンクがクリップボードにコピーされました!
ロギングカテゴリーを使用して、ログメッセージを重大度または所属するコンポーネントに基づいて整理できます。各カテゴリーは個別に設定できます。
すべてのカテゴリーについて、同じ設定がコンソール、ファイル、および syslog に適用されます。1 つ以上の名前付きハンドラーをカテゴリーにアタッチすることで、設定をオーバーライドできます。
| プロパティー名 | デフォルト | 説明 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
| ロガーがその出力を親ロガーに送信できるようにします。 |
|
|
| 特定のカテゴリーに割り当てるハンドラーの名前。 |
[a]
一部のエクステンションでは、特定のカテゴリーに対してカスタマイズされたデフォルトのロギングレベルを定義して、ログノイズを減らします。設定でロギングレベルを設定すると、エクステンションで定義されたロギングレベルがオーバーライドされます。
[b]
デフォルトでは、設定されたカテゴリーは、root ロガーカテゴリーからアタッチされたすべてのハンドラーを継承します。
| ||
プロパティーの名前でロギングカテゴリー名を使用する場合は、通常はカテゴリー名の一部であるピリオド(.)をエスケープするために、ロギングカテゴリー名を二重引用符(")内に配置します。
1.3.3. ロギングレベル リンクのコピーリンクがクリップボードにコピーされました!
ロギングレベルを使用して、Quarkus アプリケーションの正常性および安定性への影響または重大度別にログを分類できます。ロギングレベルを使用すると、純粋に情報を示すイベントから重要なイベントをフィルタリングできます。
| ロギングレベル | 説明 |
|---|---|
| OFF | ロギングをオフにする特別なレベル。 |
| FATAL | 重大なサービス障害またはサービス要求を完了できない。 |
| ERROR | リクエストの大幅な中断、リクエストに対応できない場合。 |
| WARN | 重大ではないサービスエラーまたは即時の修正を必要としない可能性がある問題。 |
| INFO | サービスライフサイクルイベントまたは重要な関連する非常に低頻度の情報。 |
| DEBUG | ライフサイクルまたは要求にバインドされていないイベントに関する追加のデバッグ情報を提供するメッセージ。 |
| TRACE | リクエストごとの追加のデバッグ情報を提供する高い頻度で配信されるメッセージ。 |
| ALL | カスタムレベルを含むすべてのメッセージの特別なレベル。 |
また、java.util.logging パッケージによって記述されるロギングレベル名を使用することもできます。
1.3.4. ルートロガー設定 リンクのコピーリンクがクリップボードにコピーされました!
root ロガーカテゴリーは、ロガー階層の最上位にあり、ロギング設定の最上位で設定されます。root ロガーは、サーバーに送信され、ロギングカテゴリーによってキャプチャーされない、指定されたロギングレベル以上のすべてのログメッセージをキャプチャーします。
| プロパティー名 | デフォルト | 説明 |
|---|---|---|
|
|
| すべてのロギングカテゴリーのデフォルトのロギングレベル。 |
|
|
| すべてのロギングカテゴリーのデフォルトの最小ロギングレベル。 |
1.3.5. Quarkus ログハンドラー リンクのコピーリンクがクリップボードにコピーされました!
ログハンドラーは、ログイベントを受信者に送信するロギングコンポーネントです。Quarkus には、次のログハンドラーが含まれています。
- コンソールログハンドラー
-
コンソールログハンドラーはデフォルトで有効になっています。アプリケーションのコンソール (通常はシステムの
stdout) にすべてのログイベントを出力します。 - ファイルログハンドラー
- ファイルログハンドラーはデフォルトで無効になっています。すべてのログイベントをアプリケーションのホスト上のファイルに出力します。ファイルログハンドラーは、ログファイルのローテーションをサポートしています。
- Syslog ログハンドラー
Syslog は、Unix 系システムでログメッセージを送信するプロトコルです。syslog プロトコルの仕様は、RFC 5424 で定義されています。
syslog ハンドラーは、すべてのログイベントを syslog サーバーに送信します (デフォルトでは、syslog サーバーはアプリケーションと同じホストで実行されます)。デフォルトでは、syslog ハンドラーは無効になっています。
1.3.6. ロギング設定の例 リンクのコピーリンクがクリップボードにコピーされました!
このセクションでは、Quarkus プロジェクトのロギングを設定する方法の例を示します。
application.properties ファイルの例
application.properties ファイルの例
デフォルトでは、root ロガーレベルは INFO に設定されています。DEBUG や TRACE などの低いレベルのログを収集する場合は、root ロガー設定を変更します。
application.properties ファイルの例
1.4. JSON ロギング形式の設定 リンクのコピーリンクがクリップボードにコピーされました!
コンソールログの出力形式を JSON に変更して、後で分析するためにログ情報を処理および保存しやすくすることができます。
JSON ロギング形式を設定するには、quarkus-logging-json エクステンションを Quarkus プロジェクトに追加する必要があります。コンソール設定の出力形式設定を quarkus-logging-json エクステンションに置き換えます。
- フォーマット文字列や色設定などのコンソール設定項目は無視されます。
- 非同期ロギングやロギングレベルを制御するものなど、その他のコンソール設定項目は引き続き適用されます。
手順
quarkus-logging-jsonエクステンションをアプリケーションのpom.xmlファイルに追加します。pom.xmlファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow (オプション)
application.propertiesファイルの JSON ロギング用のプロファイル固有の設定を行います。次の例は、開発プロファイルとテストプロファイルの JSON ロギングを無効にする方法を示しています。
application.propertiesファイルの例%dev.quarkus.log.console.json=false %test.quarkus.log.console.json=false
%dev.quarkus.log.console.json=false %test.quarkus.log.console.json=falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4.1. JSON ロギング設定プロパティー リンクのコピーリンクがクリップボードにコピーされました!
次の設定プロパティーを使用して、JSON ロギングエクステンションを設定できます。
| 設定プロパティー | 説明 | 型 | デフォルト |
|---|---|---|---|
|
| JSON コンソールのフォーマットエクステンションを有効にします。 | boolean |
|
|
| JSON レコードのプリティープリントを有効にします。 [a] | boolean |
|
|
|
日付の形式。 | string |
|
|
| 特別な記録終了区切り文字。デフォルトでは、改行が区切り文字として使用されます。 | string | |
|
|
ゾーンの ID。 | string |
|
|
| 例外の出力タイプ。 |
|
|
|
| ログの詳細な出力を有効にします。詳細には、ソースクラス名、ソースファイル名、ソースメソッド名、およびソース行番号が含まれます。 [b] | boolean |
|
[a]
一部のプロセッサーおよび JSON パーサーは、プリティープリントされた出力の読み取りに失敗する場合があります。
[b]
値は呼び出し元から取得されるため、詳細の出力はリソースを多く使用する可能性があります。
| |||
1.5. @QuarkusTest のロギング設定 リンクのコピーリンクがクリップボードにコピーされました!
@QuarkusTest のロギングを設定する場合は、それに応じて maven-surefire-plugin を設定する必要があります。java.util.logging.manager システムプロパティーを使用して LogManager を指定する必要があります。