目次へ

7. LAYOUT

7.1. org.apache.log4j.Layout クラス

このクラスは、出力するログのフォーマットを定義するクラスを作成するときに利用される抽象クラスです。この後で説明するクラスは、全てこのクラスを拡張して作られています。

7.2. org.apache.log4j.SimpleLayout クラス

このクラスは、その名の通り非常にシンプルな形式でログを出力します。このLayoutを使用して出力されるログのフォーマットは、「(ログイベント名)−(ログ出力メッセージ)」です。

 1: logger.warn("***WARN***");
 
 この文でログが出力されるとき、次のようなフォーマットで出力されます。

 WARN - ***WARN***

コンストラクタは次の一つです。

 1: SimpleLayout()

オブジェクトを Appender に追加するには、 setLayout ( Layout layout ) メソッドを使用します。

7.3. org.apache.log4j.PatternLayout クラス

このクラスを使用すると、様々な形式でログを出力することが出来ます。パターン文字列で指定したフォーマットに従い、ログが出力されます。 PatternLayout オブジェクトは次のコンストラクタで生成します。

 1: PatternLayout()
 2: PatternLayout(String pattern)

一つ目のコンストラクタはインスタンスを生成するだけですが、二つ目のコンストラクタでは、インスタンス生成時に出力フォーマットのパターンを設定することが出来ます。コンストラクタ生成時に、パターンを設定しない場合は、 setConversionPattern( String pattern ) メソッドを使用して設定することができます。

では、どのようにして出力パターンを設定するのでしょうか?変換パターンはC言語の printf 関数の変換パターンに似ています。変換パターンは、文字列と変換パターン記号から構成されます。例えば pattern="%p:%m %n" とし、 PatternLayout に設定すると次のようなログが出力されます。

 1: logger.warn("***WARN***");
 2: logger.error("***ERROR***");

 ログの出力は次のようになります。

 WARN:***WARN***
 ERROR:***ERROR***

変換パターン記号 %p はログイベントレベル 、%m はログ出力メッセージ、%n は改行を出力することを指定しています。また、優先度とログ出力メッセージには pattern に指定した通り「 : 」が入ります。このように、何をどこに出力するのかを指定することが出来ます。次の表は、変換パターン記号が何を表すのかを示すものです。より詳細な情報は、Log4J の JavaDoc を参考にしてください。特に日付の出力には様々な出力パターンがあります。

変換パターン
記号
説明
%c ログイベントのカテゴリー名を出力する。
%C ロギング要求を行うクラス名を出力する。
%d ログイベントの日時を出力する。
%d{HH:mm:ss} や %d{dd MMM yyyy HH}として、より柔軟に日時情報を出力することが出来る。
%F(*) ログ要求が発生したファイル名を出力する。
%l(*) ログが生成されたときに呼び出された位置(ソース名、行)を出力する。
%L(*) ロギング要求を行なった行番号を出力する。
%m ロギングイベントで設定されたメッセージを出力する。
%M(*) ログ要求が行なわれたメソッド名を出力する。
%n プラットフォーム依存の改行文字を出力する。
%p ログの優先度を出力します。
%r アプリケーションが開始してから、ログが出力されるまでの時間をミリ秒単位で出力する。
%t ログを生成したスレッドの名前を出力する。
%x ログが生成されたスレッドのNDC(ネスト化診断コンテキスト) を出力する。
%% %を出力する。
(*) これらを出力するときのパフォーマンスは良くないため、アプリケーションの実行速度が問題にならない場合にのみ使用することが推奨されている。

変換パターン記号の % とアルファベットの間、すなわちログイベントのカテゴリー名を出力する「 %c 」の場合は「 % 」と「 c 」の間に、数字を入れることで、それぞれの出力を右詰で表示するのか、左詰で表示するのかを制御することが出来ます。例えば、「 %5p 」とした場合、ログのイベントレベル( DEBUG や ERROR など)が 5 文字を超えない場合は、左側に空白が足されます(右詰)。「 %-5p 」とした場合は、イベントレベルが 5 文字を超えない場合は、右側に空白が足されます(左詰)。この使い方について、次の表に簡単にまとめておきます。

フォーマット例 説明
%10m 右詰:出力文字列が 10 文字以下の場合、文字列の左側に空白が挿入される。
%-10m 左詰:出力文字列が 10 文字以下の場合、文字列の右側に空白が挿入される。
%.10m 出力文字列が 10 文字を超える場合、文字列の右から数えて 11 文字目以降の文字(先頭の文字)が切り取られる。
%10.20m 右詰:出力文字列が 10 文字以下の場合、文字列の左側に空白が挿入される。
出力文字列が 20 文字を超える場合、文字列の右から数えて 21 文字目以降の文字(先頭の文字)が切り取られる。
%-10.20m 左詰:出力文字列が 10 文字以下の場合、文字列の右側に空白が挿入される。
出力文字列が 20 文字を超える場合、文字列の右から数えて 21 文字目以降の文字(先頭の文字)が切り取られる。

これまで説明してきたように、これらの出力パターンは自分で設定することが可能ですが、PatternLauout クラスには予め用意された出力パターンがあります。PatternLayout クラスのクラス変数 DEFAULT_CONVERSION_PATTERN と TTCC_CONVERSION_PATTERN を使用することが出来ます。それぞれの出力パターンは、次のように設定した場合と同じです。

クラス変数 出力パターン
PatternLayout.DEFAULT_CONVERSION_PATTERN %m%n
PatternLayout.TTCC_CONVERSION_PATTERN %r [%t] %p %c %x - %m%n

オブジェクトを Appender に追加するには、setLayout ( Layout layout ) メソッドを使用します。

(実習課題1)

全てのレベルのログイベントを故意に発生させ、WARN 以上ログイベントが発生した場合のみ、ログとして出力されるプログラムを作成しなさい。

  • PatternLayout を使用すること。
  • Appender は何を使用しても良い。
  • 様々な Pattern でログの出力を試してみること。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp