Log4J徹底解説

基本のAppdender

目次

Appdenderの基底クラス AppenderSkelton

重要で面白いのは Appdender である。このページはその導入として、さまざまな Appdenderの基底クラスから見て行こう。Appender の継承構造はこんな具合になっている。

java.lang.Object
  |
org.apache.log4j.spi.ComponentBase(1.3 NEW!)
  |
  +- org.apache.log4j.AppenderSkeleton
       |
       +- org.apache.log4j.AsyncAppender
       +- org.apache.log4j.jdbc.JDBCAppender(1.3では廃止の模様)
       +- org.apache.log4j.db.DBAppender(1.3 NEW!)
       +- org.apache.log4j.net.JMSAppender
       +- org.apache.log4j.lf5.LF5Appender(1.3では廃止の模様)
       +- org.apache.log4j.nt.NTEventLogAppender
       +- org.apache.log4j.performance.NullAppender(1.3では廃止の模様)
       +- org.apache.log4j.varia.NullAppender
       +- org.apache.log4j.varia.ListAppender(1.3 NEW!)
       +- org.apache.log4j.varia.ListModelAppender(1.3 NEW!)
       +- org.apache.log4j.varia.SoundAppender(1.3 NEW!)
       +- org.apache.log4j.net.SMTPAppender
       +- org.apache.log4j.net.SocketAppender
       +- org.apache.log4j.net.SocketHubAppender
       +- org.apache.log4j.net.SyslogAppender
       +- org.apache.log4j.net.TelnetAppender
       +- org.apache.log4j.net.UDPAppender(1.3 NEW!)
       +- org.apache.log4j.net.MulticastAppender(1.3 NEW!)
       +- org.apache.log4j.multiplex.MultiplexAppender(1.3 NEW!)
       +- org.apache.log4j.WriterAppender
            |
            +- org.apache.log4j.ConsoleAppender
            +- org.apache.log4j.FileAppender
                 |
                 +- org.apache.log4j.DailyRollingFileAppender(1.3 Deprecated)
                 +- org.apache.log4j.RollingFileAppender(1.3 Deprecated)
                 |    |
                 |    +- org.apache.log4j.varia.ExternallyRolledFileAppender(1.3 Deprecated)
                 |
                 +- org.apache.log4j.rolling.RollingFileAppender(1.3 NEW!)

というわけだと、重要なのは org.apache.log4j.AppenderSkelton である。これがすべての Appender に共通なメソッドを定義しているわけである。

この AppenderSkelton で重要なオプションが一つだけある。それは Threshold オプションである。だからこれはどんな Appender に対しても共通に使える唯一のオプションになる。

log4j.appender.名前=org.apache.log4j.SomeAppender
log4j.appender.名前.Threshold=INFO

とやってやれば、INFOが「閾値」として働き、INFO未満のログレベルのイベントは無視することになる。なので、例えば「すべてのログレベルを処理するんだけど、標準出力にはすべてのログレベルの場合を吐くが、ファイル保存は INFO 以上にしたい」というような時に使えるわけである。

WriterAppender

この WriterAppender は、ストリーム出力系Appender の基底クラスであり、特にこれを設定ファイルに書いて使うようなものではない。とはいえ、いくつかここで定義されるオプションがあり、これらは当然 WriterAppender を継承するサブクラスの Appender で使えることになる。

ImmediateFlush
true or false を取る。これはログが書かれたら即時に flush() (書き込みバッファの内容をデバイスに反映)するかどうかのフラグである。デフォルトは true で、即時に反映する。
Encoding
出力ストリーム(実装では OutputStreamWriter)のエンコーディングを指定する。デフォルトは指定なし(OSでのデフォルトエンコーディングに従う)。たとえば UTF-8 で出してやりたいのならば、ここで「UTF8」という風に指定してやる。ここらへんは「エンコーディング表」を参照して欲しい。
Threshold
(ApplenderSkeltonから継承)

ConsoleAppender

さて、もうお馴染みの ConsoleAppender である。これは標準出力or標準エラー出力に対して、ログを吐き出すものだ。一旦 org.apache.log4j.WriterAppender を介しているあたり、なかなか奥ゆかしい設計だが、WriterAppender 自体は別に抽象クラスではないが、フツーはこれをインスタンス化することはなくて、その派生クラスである ConsoleAppender や FileAppender を使う。要するに「java.io.OutputStreamやjava.io.Writerに吐く」ということで、共通化しているわけだ。

ConsoleAppender にもただ一つ固有のオプションがある。

Target
標準出力(System.out)か、標準エラー出力(System.err)かを選択できる。デフォルトは System.out である。その他の java.io.OutputStream を使いたければ、WriterAppender を継承したクラスを作らなきゃならんな。
Threshold
(ApplenderSkeltonから継承)
ImmediateFlush
(WriterAppenderから継承)
Encoding
(WriterAppenderから継承)

こいつは使い方なんぞ、もういいな。



copyright by K.Sugiura, 1996-2006