1. Log4J の基本
1.1. Log4J とは
作成したプログラムが正しく動作しているのかどうかを検証するには様々な方法があります。小規模なプログラムであれば、ソースの中に System.out.println( ) などを埋め込み、変数の値の追跡やプログラムのロジックを確認することは出来ると思います。規模が大きくなればそのような方法では限界がありますので、デバッグツールやロギングツールなどを使用します。ログを集めることにより、プログラム実行時の正確な流れを把握することが出来ますし、ログを分析して監査ツールとして利用できる可能性もあります。
Log4J は Jakarta プロジェクトで開発が進められている Java プログラム用のログ API です。Log4J を利用することで、様々なロギングが可能になります。またパフォーマンスにも十分に配慮されて設計されているので、ログの記録に用いるコードをプログラムソースに残したまま出荷しても、特に問題は起こらないようになっています。
他にも Log4J の優れた機能があります。ログを出力する部分をグループ化しておくことで、プログラム中の特定部分の動作情報だけを出力したり、出力先にファイル、OutputStream、java.io.Writer、リモート Log4J サーバ、リモート Unix Syslog デーモン、NT イベントログなどを簡単に指定することができます。
Log4J はJakarta プロジェクト 1 から入手することができます。
以降、2002年7月5日にリリースされた Log4J Version 1.2.5 について説明します。
1.2. Log4J の構成
Log4J には 3 つの主要なコンポーネントがあります。
- Logger
- Appender
- Layout
Logger は Log4J パッケージの中心クラスで、ロギングを行う部分をグループ化し、必要なグループのログだけを出力したり、カテゴリーに優先順位をつけることにより様々な出力方法を指定することができます。
Appender はログの出力先を指定するものです。Appender で設定できる出力先は、冒頭でも述べたように、ファイル、OutputStream、Java.io.Writer、リモート Log4J サーバ、リモート Unix Syslog デーモン、Windows NT イベントログなどです。
Layout はその名の通り、ログの出力フォーマットを指定するものです。単純なテキスト出力、ユーザが指定したレイアウト、HTML のテーブルレイアウトなどを指定することができます。
1.3. org.apache.log4j.Logger クラス
org.apache.log4j.Logger クラスはログイベントを発生させるために使用されるクラスです。Logger インスタンスにログ出力レベルを設定しておくことで、あるレベルを超えた場合にのみログイベントを発生させるというようなことが可能になります。
Logger は階層を形成し、親 Logger に設定された属性などは子 Logger に継承されます。階層の最上位にはRootLogger が存在します。RootLogger は、必ず存在し、名前で検索することが出来ません。
Logger インスタンスは、Logger クラスのクラスメソッドを使用して生成します。
1: getLogger(Class clazz) 2: getLogger(String name) 3: getLogger(String name, LoggerFactory factory)
一つ目のメソッドは、Logger.getLogger( SampleClass.class.getName( ) ) のように使用します。これは結局二つ目のメソッドと同じであるといえます。クラスの名称を Logger インスタンスに設定するのか、好きな名前を Logger インスタンスにつけるのかの違いだけです。
これらのメソッドは、引き数に指定された名前を持つ Logger インスタンスを検索し、あればそのインスタンスへの参照を返し、なければ新たに Logger インスタンスを生成します。
もう一つ、引き数に生成する Logger インスタンスの名前と、org.apache.log4j.spi.LoggerFactory インタフェースを実装したクラスのインスタンスをとるメソッドがありますが、ここでは説明を省略します。
Logger インスタンスを生成したら、ログイベントを発生させるレベルを決めなくてはなりません。Log4J では次の 5 つのレベルに対してログイベントを発生させることが可能です。DEBUG が最も低いレベルで、FATAL が最高のレベルということになります。
DEBUG < INFO < WARN < ERROR < FATAL
生成した Logger インスタンスにログレベルを設定するには、Category クラスの setLevel( ) メソッドを使用します。 Logger クラスは Category クラスを継承しているので、このメソッドを使用することが出来ます。setLevel( ) メソッドの引き数に、ログレベルを設定します。org.apache.log4j.Level のクラス変数、ALL、OFF、DEBUG、INFO、WARN、ERROR、FATALのいずれかを設定します。ALL は全レベルのイベントを発生させ、逆に OFF は全レベルのイベントを発生させない時に使用します。
最後にどのようにして Logger インスタンスがログイベントを発生させるのかを説明します。これも Category クラスのメソッドを使用します。DEBUG から FATAL までのログレベルに対応したメソッドがあります。debug( )、info( )、warn( )、error( )、fatal( )を使用して、それぞれのレベルのログイベントを発生させます。
以下に、インスタンスを生成して、ログを出力させる例を示します。
// インスタンスの生成 Logger logger=Logger.getInstance(Sample.class.getName()); // ログレベルが WARN 以上の場合にログイベントが発生するように設定 logger.setLevel(Level.WARN); //ログ出力 logger.info("This is info.");//出力されない logger.warn("This is warn.");//出力される logger.error("This is error.");//出力される
1 [2012/5/23追記] 2011/12/21にてJakarta Projectは廃止されました。このプロジェクトはApache Projectに移管済みです