Log4J徹底解説

その他のAppender

目次

AsyncAppdender

さて、これはちょっと特殊用途である。基本的に Appender たちは「同期して」動作するものである。ネットワーク系など中にはちょっとばかり動作が遅い可能性のあるものもあるんだが、その場合でもロギングが終ってから、呼び元に戻るわけである。この AsyncAppender は、動作を「非同期」にするものだ。つまり、一旦ロギングのリクエストをキューに貯めたら、すぐに呼び元に戻り、テキトーに別スレッドの別スケジュールでロギングの実行をしてやる...というものだ。

そういうものなので、設定は超特殊だ。まず、log4j.properties に書けないあたりからイカれてる。log4j.xml に書くんである。また、当然 AsyncAppender の中に更に実際の作業をする Appender(複数)を突っ込んでやることになるわけなので、こんな風になる。要するに「プロパティ形式だとうまくAppenderの中にAppenderを入れる構文が作れない...」から、XML専用なっているんだろう。

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
   <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
      <appender-ref ref="TEMP"/>
      <appender-ref ref="CONSOLE"/>
   </appender>

   <!-- テストコード。ASYNCから呼び出す //-->
   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
      <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" 
             value="ASYNC: %d %-5p [%t] - %m%n"/>
      </layout>
   </appender>

   <!-- テストコード。ASYNCを介さず直接呼び出す //-->
   <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
      <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" 
             value="DIRECT: %d %-5p [%t] - %m%n"/>
      </layout>
   </appender>

   <appender name="TEMP" class="org.apache.log4j.FileAppender">
      <param name="File" value="mylog.log" />
      <param name="Append" value="true" />
      <layout class="org.apache.log4j.PatternLayout">
           <param name="ConversionPattern" 
             value="%d %-5p [%t] - %m%n"/>
      </layout>
   </appender>

   <root>
      <priority value="debug"/>
      <appender-ref ref="ASYNC"/>
      <!-- 直接呼び出し //-->
      <appender-ref ref="stdout"/>
   </root>
</log4j:configuration>

筆者なぞは人間が悪辣に出来ているので、ちょっと ASYNC の効果を強引に引き出すようなテストサンプルを作ってみた。フツーに入力したんじゃ同じで ASYNC と DIRECT の行が交互に出るだけだが、カット&ペーストかなんか使って、強引に30件程のテストコードを流し込んでやると、次のように出力する。

DIRECT: 2004-09-14 17:53:26,579 INFO  [main] - test
DIRECT: 2004-09-14 17:53:26,580 INFO  [main] - test
DIRECT: 2004-09-14 17:53:26,580 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,572 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,573 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,574 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,574 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,575 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,575 INFO  [main] - test
DIRECT: 2004-09-14 17:53:26,610 INFO  [main] - test
DIRECT: 2004-09-14 17:53:26,610 INFO  [main] - test
DIRECT: 2004-09-14 17:53:26,611 INFO  [main] - test
DIRECT: 2004-09-14 17:53:26,611 INFO  [main] - test
DIRECT: 2004-09-14 17:53:26,611 INFO  [main] - test
DIRECT: 2004-09-14 17:53:26,612 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,575 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,576 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,576 INFO  [main] - test
ASYNC: 2004-09-14 17:53:26,577 INFO  [main] - test

まあ、Async の効果が少しは効いているようである。勿論、こうなるかどうかは、皆さんのマシンのスピードとメモリの空き具合にも依存するので、筆者の知ったことではないが。もし、クリティカルな環境でログ取りが必要なケースで、AsyncAppender を検討するのもよかろう。

オプションは次のものがある。

BufferSize
保留可能なイベントの数。デフォルトは 128 なので、実際の実行は結構後の可能性もある。
LocationInfo
Boolean値で、通信があるケースでは「どのファイルの何行目でエラーが生成した」という情報は、オーバーヘッドが大きい。だから、通信量を減らすために、特に受け取り側でその情報が不要ならば、これを「false」として転送しないようにする、というフラグである。これはネットワーク系Appender でよく使うので、それに渡すためにここで設定可能になっているんだろう。デフォルトは false で「発生元」をつけない。
Blocking(1.2.14で追加)
1.2.14 で AsyncAppender の内部はかなり変わっている。とはいえ、外部インターフェイスにはこのオプションの追加以外の変更はない。まあ、この変更はイベント保留Buferが満杯になると、ブロックし続けちゃう....という困った動作を回避するための Fix なので、この Blocking オプションは、イベントを保留するBufferが満杯の場合、AsyncAppender のレベルでブロックするかどうかを指定するものだ。デフォルトは true であり、これは以前の動作との互換で、Buffer が満杯ならばブロックする。Blocking=false ならば、これが新動作であり、ブロックせずにそのまま何もせずに戻る。
Threshold
(AppenderSkeltonから継承)

まあ、フツーの環境で以上のテストコードで実行してみても、大してフツーの場合と違う実行結果が得られるわけじゃない。

LF5Appdender

さて、「LF5」は「LogFactor5」の略である。これは log4j 付属のGUIのログビューア(Swingベース)である。現在 Chainsaw という別なログビューア(「Chainsaw(1.3)」を参照のこと)が開発されているんで、どうなることやら...と思っているのだが、1.3-alfa-8 にはこの LF5Appender は入っていない。まあ、2つサポートするのはバカバカしいので、消える予定のようである。で、この LF5Appender は、ライブラリレベルで LogFactor5 を起動してログを表示する、というものである。勿論スタンドアロンのアプリとして LogFactor5 は起動可能で、ファイルに格納されたログを表示することも出来るが、LF5Appender は単に Appender としてログの「宛先」として働く。

そういうものなので、特にオプションとかもない。単純に、

log4j.appender.lf5=org.apache.log4j.lf5.LF5Appender
log4j.rootLogger=debug, stdout, lf5

だけで充分に LogFactor5 のお姿を拝見できる。こんなものだ。

で、これは簡単なのだが、当然「ログビューア」であるからにして、「ファイルに保存したログを見る」のが本業である。これが若干厄介なのである。LogFactor5 は特定のフォーマットのログファイルしか理解できないのだ。LogFactor5が理解可能なファイル形式はこんなものだ。

[slf5s.start]14 9 2004 18:27:27,633[slf5s.DATE]
INFO[slf5s.PRIORITY]
[slf5s.NDC]
main[slf5s.THREAD]
jp.or.nurs.sug.log4j.test.TestLog4j[slf5s.CATEGORY]
jp.or.nurs.sug.log4j.test.TestLog4j.main(TestLog4j.java:11)[slf5s.LOCATION]
ENTER: TestLog4j[slf5s.MESSAGE]

[slf5s.start]14 9 2004 18:27:50,963[slf5s.DATE]
INFO[slf5s.PRIORITY]
[slf5s.NDC]
main[slf5s.THREAD]
jp.or.nurs.sug.log4j.test.child.TestChild[slf5s.CATEGORY]
jp.or.nurs.sug.log4j.test.child.TestChild.doSomething(TestChild.java:31)[slf5s.LOCATION]
test INFO[slf5s.MESSAGE]

[slf5s.start]14 9 2004 18:27:55,957[slf5s.DATE]
WARN[slf5s.PRIORITY]
[slf5s.NDC]
main[slf5s.THREAD]
jp.or.nurs.sug.log4j.test.child.TestChild[slf5s.CATEGORY]
jp.or.nurs.sug.log4j.test.child.TestChild.doSomething(TestChild.java:29)[slf5s.LOCATION]
test WARN[slf5s.MESSAGE]

で、この形式でファイル保存をするとなると、PatternLayout を使ってこんな定義が必要だ。

log4j.appender.lf5file=org.apache.log4j.FileAppender
log4j.appender.lf5file.File=forlf5.log
log4j.appender.lf5file.Append=true
log4j.appender.lf5file.layout=org.apache.log4j.PatternLayout
#以下3行は一行(\改行で継続行表記)だよ!
log4j.appender.lf5file.layout.ConversionPattern=[slf5s.start]%d{DATE}[slf5s.DATE]%n\
%p[slf5s.PRIORITY]%n%x[slf5s.NDC]%n%t[slf5s.THREAD]%n%c[slf5s.CATEGORY]%n%\
l[slf5s.LOCATION]%n%m[slf5s.MESSAGE]%n%n

log4j.rootLogger=debug, stdout, lf5file

で、スタンドアロンで LogFactor5 を起動するんなら、次のようなコマンドだ。[ファイル]メニューから[開く]を選んで、ログファイルを指定すれば良い。

% java org.apache.log4j.lf5.StartLogFactor5

NullAppdender

こんなんオマケだ。プログラマ好みの「完全性」の問題とも言えるが、NullAppender があるんである。要するにNOPであり、何もしない Appender である。ログ出力は宙に消えていく...なのになぜか 1.2.8 では2つも NullAppender があるんである!

org.apache.log4j.varia.NullAppender がホントの NullAppender(言い方変だが)であり、org.apache.log4j.performance.NullAppender はどうやらパフォーマンス測定用に使った実験用 Appender がなぜかパッケージに紛れ込んだ、というようなもののようだ。なのでアルファの1.3 では、org.apache.log4j.performance.NullAppender は消えている。

そういうものなので、オプションがあるわけない。設定例とか見たいかい?



copyright by K.Sugiura, 1996-2006