Log4jについて

Log4jとは?

Log4jはjava用のロギングAPIです。
って、例によってロギングとは何か?説明していきましょう。

System.out

Exceptionをcatchしたとき、どうしますか?
食べる?それはやめてくださいね。
1つの方法は、標準出力に出力することです。
}catch(Exception e){
  System.out.println(e);
  //e.printStackTrace();でもいいけど
}
あるいは、実行中のプログラムの変数の値を確認したいとき、どうしますか?
最も簡単なやり方は、やっぱりSystem.outですね。
String name = req.getParameter("name");
System.out.println("name=" + name);
でも、このやり方だといろいろと問題や物足りなさがあります。
例えば、こんなものです。
・出力のON/OFFが出来ない
・出力先が指定できない

Logクラス

運用に入るのにログの消し忘れがあると導入先からクレームが来ますよね。
また、運用時に(開発中でもいいけど)、何かしらトラブルがあった場合、
全くログを消していると、どこを調べていいのか、手のつけようがありません。
やはりログのオンオフは、設定で切り替えられる方が便利です、
お手軽にLog出力用のユーティリティクラスを作るとこんな感じでしょうか?
public class Log{
  private static boolean LOG_ON = true;
  public static void log(Object message){
    if(LOG_ON){
      System.out.println(message);
    }
  }
  public static void log(Throwable error){
    if(LOG_ON){
       error.printStackTrace();
    }
  }
}
このLOG_ONフラグで、出力ON/OFFの切り替えが可能です。
出力先を切り替えるのも標準出力を変えれば可能です。
System.setOut(new PrintWriter("..."));

Log4j

でもって、ようやくLog4jですが、簡単に言うと先のLogクラスのすごいやつです。
お気楽Logクラスに比べ、何がすごいかって言うと、Log4jの概念を表す3つの言葉に象徴されます。
3つの言葉とはCategories, Appenders, Layoutsです。

Categories
 出力範囲と出力レベルを設定できます。
 例えば、DEBUGレベル以上で、com.muimi.hogeパッケージ以下のログだけ出そうということが可能です。

Appenders
 出力先を指定できます。マニュアルを見ると、

 コンソール, ファイル, GUI コンポーネント, リモートソケットサーバ, JMS, NT イベントログ, リモート・UNIX Syslog デーモン ファイル、ソケット、メール、多種多様なものにおくれます。

 う〜ん。いろいろありますね。

Layouts
 出力情報とレイアウトをカスタマイズできます。例えば、
2000-09-07 14:07:41,508 [main] INFO  MyApp - Entering application.
2000-09-07 14:07:41,529 [main] INFO  MyApp - Exiting application.
こんなにしたり
 INFO [main] (MyApp2.java:12) - Entering application.
DEBUG [main] (Bar.java:8) - Doing it again!
 INFO [main] (MyApp2.java:15) - Exiting application.
こんなにしたり、いろいろできます。

上の3点に加え、
パフォーマンスについてもチューニングされている。
マルチスレッドでクライアントごとのログを取得する機能(ネスト化診断コンテキスト)の 機能もあるらしいです。
と、まあ速くて柔軟性のあるロギングAPI、それがLog4jです。
System.outの消し忘れに悩んでいるあなたは是非使いましょう。
自作Logクラスを使っているあなたも、一度触ってみてください。

使い方については、Ja-Jakarta-Log4jが詳しいので、そちらを参照してくださいませ。

余談ですが、
自分が欲しいと思うような機能というものは、たいてい、既に誰かが作ってるもんです。
北の国からのように、何事も自分の手でやってみたいという人もたまにいますが、
こんな機能が必要だと思ったら、いきなり作る前に探す方がよいでしょう。
それがオブジェクト指向の部品化、再利用ってもんです。

JDK1.4

と、Log4jについて簡単に書いたんですが、JDK1.4には、既にロギングAPIが標準装備されています
java.util.loggingパッケージがそれで、ロギングについての機能が実装されています。
Log4jがいかに優秀であっても、一般的に使われる標準のロギングAPIは、時間が経つにつれ標準装備の方に移っていくと思います。
今のうちは、JDKのバージョンやらパフォーマンスやら必要な機能を検討して、よい方を使えばよいでしょうか。

(2002/7/10)
もどる