Log4J徹底解説

Chainsaw(1.3)

目次

Chainsaw とは

筆者は別に新しいもの好きではないが、ついでなのでこれをやってみようと思う。Chainsaw とはやはり Apache Logging プロジェクトで開発しているログビューアだが、当然これは Log4J からの利用を前提として設計されているわけである。で、新しい Log4J のバージョン 1.3 に対応するのが、Chainsaw v2 である。Log4J 1.3 で「Receiver」という概念が登場し、Appender と大体対応しながらそれを「受け取る側」をプラグイン化してしまう、というやり方になった。だから、Log4J のネットワーク系 Appender のほとんどすべてに、この Chainsaw が対応することになる。

まあ、いろいろなネットワーク系Appender の中には「どこにクライアントがあるんだろう???」と悩むようなものがあった(SocketHubAppenderとかね)が、こいつが一応それらのクライアントとして動作するわけだ。なので、Chainsaw を使って、新規に登場した UDPAppdender を使ってみようと思う。

まあ、Apache Logging プロジェクトあたりから、chainsaw-bundle.zip を落したまえ。こいつの中に log4j-1.3alpha.jar とか、新しいバージョンの Log4J とかも入っている。まあ、chainsaw.bat で起動スクリプトは Windows 用しかないが、こんなもんはこの通りだ(そういや最近のバージョンには chainsaw.sh は入っている)。

java -classpath log4j-chainsaw-1.3alpha.jar:log4j-1.3alpha.jar:jakarta-oro-2.0.6.jar \
  org.apache.log4j.chainsaw.LogUI

Chainsaw v2 で遊ぶ

で、次のようなウィンドウが開く。その前に初期設定のウィンドウが開くだろうが、無視して構わない。

ペインが一応「左」「中」「右」の3層になるんだが、今はまだ「左+中」「右」しか見えない。左ぺインはちょっとしたチュートリアルになっており、「どういうソースからログを受け取るの?」は右ぺインの担当だ。右ペインの「Receivers」を右クリックすると、ポップアップメニューが出て、そこで「New Receiver」→ 「New UDPReceiver」で次の画面が開く。

設定項目がいろいろとあるが、基本的には「name(表示上の名前)」「port(監視するポート)」だけでOKだ。しかし、ここで注意して欲しいのは、「decoder」が「org.apache.log4j.xml.XMLDecoder」になっていることだ。これは要するに、UDPAppenderは仕様上は単なるテキストで任意のフォーマットのログを送るんだが、「こんなフォーマット知らんぞ...」ということになると困るので、ここでは XMLLayout を使わなければならない、ということを示しているのである。

で、上部に「Welcome」「Drag & Drop XML log files here」とか並んだタブがあるが、要するに「タブ切替え」方式になっている。現状では「chainsaw-log」という Chainsaw の内部ログを表示しているわけである。こんな感じで、ログを受け付けたらタブになるし、右ぺインの「Root Logger」→「org」といったツリーは、ログを生成したクラスによるセレクションみたいな動作をする。

だから、UDPAppender を使った log4j.properties はこんな風になる...はずだが、どうもバグがあって、ソケットをリスンできてないようだ。

log4j.appender.udp=org.apache.log4j.net.UDPAppender
log4j.appender.udp.port=4352
log4j.appender.udp.RemoteHost=localhost
log4j.appender.udp.layout=org.apache.log4j.xml.XMLLayout

log4j.rootLogger=debug, stdout, udp

なので、今回は同様な設定法で SocketAppender による表示例を示そう。

で、Log4J でロギングするアプリを起動するが、新しい log4j である log4j-1.3alpha.jar をちゃんとクラスパスを通すのは言うまでもない。そうすると、多分次のようにあなたが生成したログを Chainsaw が受け取ると思う。多分下のタブにあなたのホスト名とかが表示されると思うので、それをクリックすればログビューアとして表示する。このタブは最近では例の「Applicationオプション」に対応するようになっている。Chainsaw では「Applicationごとに」ログを仕訳することができるのがメリットになるわけだ。

要するに右ぺインは「カテゴリー階層」を示し、中ぺインの上はログのリスト、中ぺインの下はその詳細情報である。LogFactor5 よりもずっとカラフルでグラフィック多用になっている辺りがウリかな。

まあ、こんなものであるが、同様にして SocketAppender とか SocketHubAppender(こいつの場合には先に Log4J を使ったアプリ側を起動しておく)もテストできる。が、MulticastAppender はちょっとばかりマルチキャスト対応ルータとかが要るかもしれんので、うまくいかなくても心配しないでくれ。

....けど、最近の Chainsaw は、1.3 の修正にあまり追随できてないようだ。まあαだから仕方がないんだが、ちょっとバグだらけ状態に近い感じだ。最近のパッケージだと、実は UDPAppender のテストがうまく動かなかった...SocketAppender でのテストはOKだったんだが。ふう、ホント筆者がアルファテスターしてるみたいな気分だ...

Chainsaw の Receiver

で、log4j-1.3 ⇔ Chainsaw v2 の対応関係で考えた時に、設計のポイントは「ログを送る Appender と、ログを受け取る Receiver をペアにして開発する」というあたりの狙いがある。だから、ネットワーク系を中心に、いろいろな「Receiver」があることになるわけだ。どんなものが 1.3alpha-8 にあるか...というと、こんな感じになる。要するにこれが Chainsaw 機能一覧みたいな感じになるわけだ。

org.apache.log4j.net.SocketReceiver
SocketAppenderとペアになり、TCP Socket による Serialize された LoggingEvent オブジェクトを受信する。
org.apache.log4j.net.XMLSocketReceiver
Socket 通信系のものだが XML フォーマットで送られたログイベントを受信する。Log4J では SocketAppender は Java オブジェクトをそのまま送るが、log4cxx とか log4php などでは、XML で送るオプションがある。それらを受けるためのものである。
org.apache.log4j.net.UDPReceiver
UDPAppenderとペアになる。UDP で送信する。
org.apache.log4j.net.MulticastReceiver
MulticastAppenderとペアになる。マルチキャストソケットで受信する。
org.apache.log4j.xml.LogFileXMLReceiver
....なぜか 1.3-alpha-8 にこのクラスが入っていない....名前から考えると、XML 形式のログファイルを LoggingEvent に変換する Receiver だろう。
org.apache.log4j.varia.LogFilePatternReceiver
これは任意のプレーンなログファイルから、LoggingEvent を再構築する Receiver である。「逆レイアウト指定」のようなことをして、ファイルの各行からログ要素を抜きだしていく。
org.apache.log4j.db.CustomSQLDBReceiver
これはなぜかJDBCAppenderと対応する...廃止じゃなかったんだっけ? 要するに SQL を自分で書いて...というタイプだ。動作はDBに対する定期的な SELECT により、DB を監視する...というものである。
org.apache.log4j.db.DBReceiver
こっちはDBAppenderと対応する。Log4J が決めたフォーマットのDBに同様な監視を行う。なぜか Chainsaw の側になく、1.3-alpha-8 にはある。



copyright by K.Sugiura, 1996-2006