Red Hat Training
A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform
第12章 ロギングサブシステム
12.1. はじめに
12.1.1. ロギングの概要
JBoss EAP 6 は、独自の内部使用とデプロイされたアプリケーションによる使用の両方で設定可能なロギング機能を提供します。logging サブシステムは JBoss LogManager をベースとしており、JBoss Logging だけでなくサードパーティーのアプリケーションロギングフレームワークを複数サポートします。
logging サブシステムはログカテゴリーおよびログハンドラーのシステムを使用して設定されます。ログカテゴリーはキャプチャーするメッセージを定義し、ログハンドラーはこれらのメッセージの処理方法(ディスクへの書き込み、コンソールへの送信など)を定義します。
ロギングプロファイルを使用すると、一意に名前付きのロギング設定のセットを作成し、他のロギング設定とは関係なくアプリケーションに割り当てることができます。ロギングプロファイルの設定はメインの logging サブシステムとほぼ同じです。
12.1.2. JBoss LogManager でサポートされるアプリケーションロギングフレームワーク
JBoss LogManager は次のロギングフレームワークをサポートします。
- JBoss Logging - JBoss EAP 6 に含まれます
- Apache Commons Logging - http://commons.apache.org/logging/
- Simple Logging Facade for Java(SLF4J)- http://www.slf4j.org/
- Apache log4j - http://logging.apache.org/log4j/1.2/
- Java SE Logging (java.util.logging) - http://download.oracle.com/javase/6/docs/api/java/util/logging/package-summary.html
JBoss LogManager では以下の API がサポートされます。
- java.util.logging
- JBoss Logging
- Log4j
- SLF4J
- commons-logging
JBoss LogManager では以下の SPI もサポートされます。
- java.util.logging Handler
- Log4j Appender
注記
Log4j API
と Log4J Appender
を使用している場合、オブジェクトは渡される前に string
に変換されます。
12.1.3. 起動時のロギング
JBoss EAP の起動中に、Java 環境と各サービスの起動に関するログエントリーが出力されます。ログは、トラブルシューティング時に役に立ちます。デフォルトでは、すべてのログエントリーはファイル
server.log
に書き込まれます。これはランタイムモードに依存する場所です。
- スタンドアロンモード
EAP_HOME/standalone/log/server.log
- ドメインモード
EAP_HOME/domain/servers/SERVER_NAME/log/server.log
起動ロギングの設定は、設定ファイル
logging.properties
に指定されます。これはランタイムモードに依存する場所です。
- スタンドアロンモード
EAP_HOME/standalone/configuration/logging.properties
- ドメインモード
- ドメインモードでは、ドメインコントローラーと各サーバーの
logging.properties
ファイルがあります。ドメインコントローラー:EAP_HOME/domain/configuration/logging.properties
Server:EAP_HOME/domain/servers/SERVER_NAME/data/logging.properties
設定ファイルは logging サブシステムが起動し、引き継がるまで
logging.properties
がアクティブになります。
警告
logging.properties
ファイルは、直接編集する必要があるユースケースが不明な場合を除き、直接編集しないことが推奨されます。サポートケースを作成する前に、サポートケースを作成することが推奨されます。
logging.properties
ファイルに手動で行った変更は起動時に上書きされます。
12.1.4. 起動エラーの表示
JBoss EAP をトラブルシューティングする場合、最初に行う手順の 1 つとなるよう、起動中に発生したエラーをチェックする必要があります。起動時のエラーを表示する方法は 2 つあり、どちらも利点があります。各メソッドにより、起動時に発生したエラーの一覧が表示されます。提供される情報を使用して原因を診断し、解決します。トラブルシューティングに関しては、Red Hat カスタマーポータルにお問い合わせください。
server.log
ログファイルを確認します。この方法では、各エラーメッセージおよび関連するメッセージを確認でき、エラーが発生した理由の詳細を知ることができます。また、エラーメッセージをプレーンテキスト形式で表示することもできます。- JBoss EAP 6.4 から、管理 CLI コマンドの read-boot-errors を使用します。この方法では、サーバーのファイルシステムにアクセスする必要がありません。これは管理 CLI コマンドであるため、スクリプトで使用できます。たとえば、複数の JBoss EAP インスタンスを起動し、起動時に発生したエラーをチェックするスクリプトを作成できます。
手順12.1 server.log でエラーの有無を確認する
- ファイルビューアーで
server.log
ファイルを開きます。 - ファイルの最後に移動します。
- 最新の起動シーケンスの開始
を示すメッセージ識別子の backward015899
を検索します。 - ログのその位置から
ERROR
を前方検索します。各検索一致箇所には、エラーの説明が示され、関連するモジュールがリストされます。
例12.1 Error Description from server.log
以下は、
server.log
ログファイルのエラー説明の例です。
13:23:14,281 ERROR [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-4) JBWEB003043: Error initializing endpoint: java.net.BindException: Address already in use /127.0.0.1:8080
手順12.2 管理 CLI より起動エラーの一覧表示
- 以下の管理 CLI コマンドを実行します。
/core-service=management:read-boot-errors
起動中に発生したすべてのエラーがリストされます。各エラーのタイムスタンプは Java メソッドcurrentTimeMillis()
を使用します。これは、現在の時間と午前 0 時から 1970 UTC(協定世界時)の間で測定される違いです。
例12.2 read-boot-errors コマンドの出力
{ "outcome" => "success", "result" => [{ "failed-operation" => { "operation" => "add", "address" => [ ("subsystem" => "web"), ("connector" => "http") ] }, "failure-timestamp" => 1417560953245L, "failure-description" => "{\"JBAS014671: Failed services\" => {\"jboss.web.connector.http\" => \"org.jboss.msc.service.StartException in service jboss.web.connector.http: JBAS018007: Error starting web connector Caused by: LifecycleException: JBWEB000023: Protocol handler initialization failed\"}}", "failed-services" => {"jboss.web.connector.http" => "org.jboss.msc.service.StartException in service jboss.web.connector.http: JBAS018007: Error starting web connector Caused by: LifecycleException: JBWEB000023: Protocol handler initialization failed"} }] }
12.1.5. ガベッジコレクションロギング
ガベッジコレクションロギングは、すべてのガベッジコレクションのアクティビティーをプレーンテキストのログファイルに記録します。これらのログファイルは診断を行うのに便利です。JBoss EAP 6 より、ガベッジコレクションのロギングは IBM Java Development Kit 以外 のすべてのサポートされる構成では、
スタンドアロン
モードではデフォルトで有効になっています。
logging は
EAP_HOME/standalone/log/gc.log.桁
のファイルに出力されます。ログローテーションが有効化され、ログファイルの数は 5 に制限され、各ファイルは最大 3 MiB に制限されます。
12.1.6. 暗黙的なロギング API の依存関係
JBoss EAP 6 の logging サブシステムには、コンテナーが暗黙的なロギング API 依存関係をデプロイメントに追加するかどうかを制御する
add-logging-api-dependencies
属性があります。デフォルトではこの属性は true
に設定されています。これは、暗黙的なロギング API 依存関係がすべてデプロイメントに追加されることを意味します。false
に設定すると、暗黙的なロギング API 依存関係が追加されません。
add-logging-api-dependencies
属性は、管理 CLI を使用して設定できます。以下に例を示します。
/subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
12.1.7. デフォルトのログファイルの場所
これらは、デフォルトのロギング設定用に作成されたログファイルです。デフォルト設定は Periodic ログハンドラーを使用してサーバーログファイルを書き込みます。
表12.1 スタンドアロンサーバーのデフォルトログファイル
ログファイル | 説明 |
---|---|
EAP_HOME/standalone/log/server.log |
サーバーログ。サーバー起動メッセージを含む、すべてのサーバーログメッセージが含まれます。
|
EAP_HOME/standalone/log/gc.log |
ガベッジコレクションのログ。すべてのガベージコレクションの詳細が含まれます。
|
表12.2 管理対象ドメイン用のデフォルトログファイル
ログファイル | 説明 |
---|---|
EAP_HOME/domain/log/host-controller.log |
ホストコントローラーのブートログ。ホストコントローラーの起動に関連するログメッセージが含まれます。
|
EAP_HOME/domain/log/process-controller.log |
プロセスコントローラーのブートログ。プロセスコントローラーの起動に関連するログメッセージが含まれます。
|
EAP_HOME/domain/servers/SERVERNAME/log/server.log |
名前付きサーバーのサーバーログ。サーバー起動メッセージなど、そのサーバーのすべてのログメッセージが含まれます。
|
12.1.8. ロギングのフィルター式
フィルター式は、さまざまな基準に基づいてログメッセージを記録するために使用されます。フィルターチェックは、常に未フォーマットの raw メッセージに対して行われます。ロガーまたはハンドラーのフィルターを含めることができます。ロガーフィルターは、ハンドラーに配置されたフィルターよりも優先されます。
注記
ルートロガーに指定された
filter-spec
は他のロガーによって継承され ません。代わりに、ハンドラーごとに filter-spec
を指定する必要があります。
表12.3 ロギングのフィルター式
フィルタータイプ
expression
| 説明 | パラメーター |
---|---|---|
Accept
accept
| すべてのログメッセージを許可します。 |
accept
|
却下
deny
| すべてのログメッセージを拒否します。 |
deny
|
Not (否定)
not[filter expression]
| フィルター式の逆の値を返します。 |
1 つのフィルター式をパラメーターとして取ります。
not(match("JBAS"))
|
All
all[filter expression]
| 複数のフィルター式より連結された値を返します。 |
コンマ区切りの複数のフィルター式を取ります。
all(match("JBAS"),match("WELD"))
|
すべて
any[filter expression]
| 複数のフィルター式より 1 つの値を返します。 |
コンマ区切りの複数のフィルター式を取ります。
any(match("JBAS"),match("WELD"))
|
Level Change
levelChange[level]
| 指定のレベルでログレコードを変更します。 |
1 つの文字列ベースのレベルを引数として取ります。
levelChange("WARN")
|
Levels
levels[levels]
| レベルリストにあるレベルの 1 つでログメッセージをフィルターします。 |
コンマで区切られた複数の文字列ベースのレベルを取ります。
levels("DEBUG","INFO","WARN","ERROR")
|
Level Range
levelRange[minLevel,maxLevel]
| 指定されたレベル範囲内でログメッセージをフィルターします。 |
フィルター式は
[ を使用して含まれる最小レベルを示し、a ] を使用して含まれる最大レベルを示します。または、それぞれ ( または ) を使用して除外を示すこともできます。式の最初の引数は許可される最小レベルで、2 つ目の引数は最大許容レベルです。
以下に例を示します。
|
Match (match["pattern"]) | 正規表現ベースのフィルター。式に指定されたパターンに対してフォーマットされていないメッセージが使用されます。 |
正規表現を引数として取ります。
match("JBAS\d+")
|
Substitute (substitute["pattern","replacement value"]) | 最初にパターンと一致した値を指定の値に置き換えるフィルター。 |
式の最初の引数はパターンで、2 つ目の引数は置き換えるテキストです。
substitute("JBAS","EAP")
|
Replace All(substituteAll["pattern","replacement value"]) | パターンと一致したすべての値を指定の値に置き換えるフィルター。 |
式の最初の引数はパターンで、2 つ目の引数は置き換えるテキストです。
substituteAll("JBAS","EAP")
|
注記
値のコンマと引用符('\' 演算子で前)をエスケープし、式全体を引用符で囲み、値が正しく
文字列
として解釈されるようにします。それ以外の場合は、リスト
として解析されます。正しい形式の例は次のとおりです。
[standalone@localhost:9999 /] /subsystem=logging/console-handler=CONSOLE:write-attribute(name=filter-spec, value="substituteAll(\"JBAS\"\,\"SABJ\")")
12.1.9. ログレベル
ログレベルは、ログメッセージの性質と重大度を示す列挙値の順序付けされたセットです。特定のログメッセージのレベルは、開発者がメッセージを送信するために選択したロギングフレームワークの適切なメソッドを使用して指定します。
JBoss EAP 6 は、サポートされるアプリケーションロギングフレームワークによって使用されるすべてのログレベルをサポートします。最も一般的に使用される 6 つのログレベルは(最低から高い順に)
TRACE
、DEBUG
、INFO
、WARN
、ERROR
、および FATAL
です。
ログレベルはログカテゴリーとログハンドラーによって使用され、それらが担当するメッセージを限定します。各ログレベルには、他のログレベルに対して相対的な順番を示す数値が割り当てられています。ログカテゴリーとハンドラーにはログレベルが割り当てられ、そのレベル以上のログメッセージのみを処理します。たとえば、WARN レベルのログハンドラーは、
WARN
、ERROR
、および FATAL
レベルのメッセージのみを記録します。
12.1.10. サポート対象のログレベル
表12.4 サポート対象のログレベル
ログのレベル | Value | 説明 |
---|---|---|
FINEST | 300 |
-
|
FINER | 400 |
-
|
TRACE | 400 |
アプリケーションの実行状態に関する詳細情報を提供するメッセージに使用します。通常、
TRACE のログメッセージはアプリケーションのデバッグ時にのみキャプチャーされます。
|
DEBUG | 500 |
アプリケーションの個別の要求またはアクティビティーの進捗状況を示すメッセージに使用します。
DEBUG のログメッセージは通常、アプリケーションをデバッグする場合にのみキャプチャーされます。
|
FINE | 500 |
-
|
CONFIG | 700 |
-
|
INFO | 800 |
アプリケーションの全体的な進捗状況を示すメッセージに使用します。多くの場合、アプリケーションの起動、シャットダウン、およびその他の主要なライフサイクルイベントに使用されます。
|
WARN | 900 |
エラーではないが、理想的とは見なされない状況を示すために使用されます。今後エラーが発生する可能性のある状況を示す場合があります。
|
警告 | 900 |
-
|
ERROR | 1000 |
発生したエラーの中で、現在の活動や要求の完了を妨げる可能性があるが、アプリケーション実行の妨げにはならないエラーを表示するために使用されます。
|
SEVERE | 1000 |
-
|
FATAL | 1100 |
クリティカルなサービス障害やアプリケーションのシャットダウンをもたらしたり、JBoss EAP 6 のシャットダウンを引き起こす可能性があるイベントを表示するのに使用されます。
|
12.1.11. ログカテゴリー
ログカテゴリーは、キャプチャーするログメッセージのセットと、メッセージを処理する 1 つまたは複数のログハンドラーを定義します。
キャプチャーするログメッセージは、元の Java パッケージとログレベルによって定義されます。そのパッケージのクラスおよびそのログレベル以下のメッセージがログカテゴリーによってキャプチャーされ、指定のログハンドラーに送信されます。
ログカテゴリーは、独自のハンドラーの代わりにルートロガーのログハンドラーを任意で使用することができます。
12.1.12. ルートロガーについて
ルートロガーは、ログカテゴリーによってキャプチャーされないサーバー(指定レベルの)に送信されたすべてのログメッセージをキャプチャーします。これらのメッセージは 1 つ以上のログハンドラーに送信されます。
デフォルトでは、ルートロガーはコンソールおよび周期ログハンドラーを使用するように設定されています。Periodic ログハンドラーは、ファイル
server.log
に書き込むように設定されます。このファイルはサーバーログと呼ばれることもあります。
12.1.13. ログハンドラー
ログハンドラーはキャプチャーしたメッセージの記録方法を定義します。利用できるログハンドラーは、
コンソール
、ファイル
、周期
、サイズ
、Async
、syslog
、Periodic Size
、および Custom
です。
注記
ログハンドラーをアクティブにするには、少なくとも 1 つのロガーに追加する必要があります。
12.1.14. ログハンドラーのタイプ
- Console
- コンソールログハンドラーは、ログメッセージをホストオペレーティングシステムの標準
出力(標準出力
)または標準エラー(stderr
)ストリームに書き込みます。これらのメッセージは、JBoss EAP 6 がコマンドラインプロンプトから実行された場合に表示されます。オペレーティングシステムが標準出力または標準エラーストリームをキャプチャーするように設定されていない限り、Console ログハンドラーからのメッセージは保存されません。 - ファイル
- File ログハンドラーはログメッセージを指定のファイルに書き込みます。
- Periodic
- Periodic ログハンドラーは、指定した時間が経過するまで、ログメッセージを指定ファイルに書き込みます。期間が経過したら、指定されたタイムスタンプを追加してファイルの名前が変更され、ハンドラーは元の名前で新規作成されたログファイルに書き込みを継続します。
- サイズ
- Size ログハンドラーは、指定したファイルが指定したサイズに達するまで、ログメッセージを名前付きファイルに書き込みます。ファイルが指定したサイズに達すると、数値の接尾辞が付いて名前が変更され、ハンドラーは元の名前で新規作成されたログファイルに書き込みを継続します。各サイズログハンドラーは、この方式で保管されるファイルの最大数を指定する必要があります。
- Periodic Size
- JBoss EAP 6.4 から利用できます。これは Periodic および Size ハンドラーの組み合わせで、組み合わされた属性をサポートします。現在のログファイルが指定されたサイズに達する か、指定の期間が経過すると、ファイルの名前が変更され、ハンドラーは元の名前で新規作成されたログファイルに書き込みを継続します。
- 非同期
- 非同期ログハンドラーは、1 つ以上のログハンドラーに対して非同期動作を提供するラッパーログハンドラーです。これは、待ち時間が長い可能性があるログハンドラーや、ネットワークファイルシステムへのログファイルの書き込みなど、パフォーマンス上の問題がある場合に役立ちます。
- カスタム
- Custom ログハンドラーを使用すると、実装された新しいタイプのログハンドラーを設定することができます。カスタムハンドラーは、
java.util.logging.Handler
を拡張し、モジュールに含まれる Java クラスとして実装する必要があります。 - syslog
- syslog ハンドラーは、リモートのロギングサーバーへメッセージを送信するために使用できます。これにより、複数のアプリケーションが同じサーバーにログメッセージを送信でき、そのサーバーですべてのログメッセージを解析できます。
12.1.15. ログフォーマッター
ログフォーマッターは、ログハンドラーの設定プロパティーで、そのハンドラーからのログメッセージの表示を定義します。これは、
java.util.Formatter
クラスに基づいた構文を使用する文字列です。
たとえば、デフォルト設定のログフォーマッター文字列
%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n
は、以下のようなログメッセージを作成します。
15:53:26,546 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990
12.1.16. ログフォーマッター構文
表12.5 ログフォーマッター構文
記号 | 説明 |
---|---|
%c | ロギングイベントのカテゴリー |
%p | ログエントリーのレベル (情報やデバッグなど) |
%P | ログエントリーのローカライズレベル |
%d | 現在の日付/時刻 (yyyy-MM-dd HH:mm:ss,SSS 形式) |
%r | 相対時間 (ログが初期化された以降のミリ秒単位の時間) |
%z | タイムゾーン |
%k | ログリソースキー (ログメッセージのローカリゼーションに使用) |
%m | ログメッセージ (例外トレースを除外) |
%s | 単純なログメッセージ (例外トレースなし) |
%e | 例外スタックトレース (拡張モジュール情報なし) |
%E | 例外スタックトレース (拡張モジュール情報あり) |
%t | 現在のスレッドの名前 |
%n | 改行文字 |
%C | ログメソッドを呼び出すコードのクラス (低速) |
%F | ログメソッドを呼び出すクラスのファイル名 (低速) |
%l | ログメソッドを呼び出すコードのソースロケーション (低速) |
%L | ログメソッドを呼び出すコードの行番号 (低速) |
%M | ログメソッドを呼び出すコードのメソッド (低速) |
%x | ネスト化診断コンテキスト |
%X | メッセージ診断コンテキスト |
%% | リテラルパーセント記号 (エスケープ) |