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 LogManager では以下の API がサポートされます。
  • java.util.logging
  • JBoss Logging
  • Log4j
  • SLF4J
  • commons-logging
JBoss LogManager では以下の SPI もサポートされます。
  • java.util.logging Handler
  • Log4j Appender
注記
Log4j APILog4J 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 でエラーの有無を確認する

  1. ファイルビューアーで server.log ファイルを開きます。
  2. ファイルの最後に移動します。
  3. 最新の起動シーケンスの開始 を示すメッセージ識別子の backward015899 を検索します。
  4. ログのその位置から 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 つ目の引数は最大許容レベルです。
以下に例を示します。
  • levelRange("DEBUG","ERROR")
    最小レベルは DEBUG よりも大きく、最大レベルは ERROR 未満でなければなりません。
  • levelRange["DEBUG","ERROR")
    最小レベルは DEBUG 以上で、最大レベルは ERROR 未満でなければなりません。
  • levelRange["INFO","ERROR"]
    最小レベルは INFO 以上で、最大レベルは ERROR 以下でなければなりません。
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 つのログレベルは(最低から高い順に) TRACEDEBUGINFOWARNERROR、および 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. ログハンドラー

ログハンドラーはキャプチャーしたメッセージの記録方法を定義します。利用できるログハンドラーは、コンソールファイル周期サイズAsyncsyslogPeriodic 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 メッセージ診断コンテキスト
%% リテラルパーセント記号 (エスケープ)