LastUpdate: 2009/07/31 02:02:59

戻る

Link

Log4J徹底解説
http://www.nurs.or.jp/~sug/soft/log4j/index.htm

Log4j Q&A
http://www.okisoft.co.jp/esc/log4j/index.html


20051003 初期化ファイルの設定方法
20090725_Log4jのバージョン
20090725_log4jのDownLoad
20090725_とにかく動かしてみる
20090726_log4jのプロパティファイルを利用してみる
20090726_カテゴリーについて
20090726_設定ファイルの読み込み
20090726_カテゴリーの使い分け


20051003 初期化ファイルの設定方法

いくつかの方法がある

システムプロパティから設定する方法

-Dlog4j.configuration=file:///c:/temp/log4j.xml

-Dlog4j.configuration=file:///c:/temp/log.properties

設定ファイルを log4j.xml または log4j.properties という名前でクラスパスに含ませる方法


 

20090725 Log4jのバージョン

1.1系に始まり、1.2系が一般的に使われているらしい。

1.3系のリリース予定もあったが、1.2系と互換性が無いことから、正式リリースは見送られたらしい。

http://www.nurs.or.jp/~sug/soft/log4j/index.htm

2009/07/25現在、最新版は 1.2.15である。


20090725 log4jのDownLoad

http://logging.apache.org/log4j/1.2/download.html

Windowsなら apache-log4j-1.2.15.zip を取得すれば良い。解凍後、log4j-1.2.15.jar をクラスパスに追加すればよいだけ


20090725 とにかく動かしてみる

Hello.java

import org.apache.log4j.Logger; 
import org.apache.log4j.BasicConfigurator;

public class Hello {
  static Logger logger = Logger.getLogger(Hello.class);
  
  public static void main(String argv[]) {
      
    BasicConfigurator.configure();
    logger.debug("Hello world.");
    logger.info("What a beatiful day.");
    
  }
}
0 [main] DEBUG Hello  - Hello world.
0 [main] INFO Hello  - What a beatiful day.

20090726 log4jのプロパティファイルを利用してみる

example.ExLog1.java

package example;

import org.apache.log4j.*;
import org.apache.log4j.xml.*;
import java.io.*;

//http://www.javaroad.jp/opensource/js_log4j2.htm

public class ExLog1 {
    // (1)Loggerオブジェクトの生成
    static Logger log = Logger.getLogger(ExLog1.class.getName());

    public static void main(String[] args) {
        // (2)設定ファイルの読み込み
        DOMConfigurator.configure("log4j.xml");

        ExLog1 obj1 = new ExLog1();
        ExLog2 obj2 = new ExLog2();

        obj1.methodA();
        obj2.methodB();
    }

    void methodA() {
        try {
            FileReader in = new FileReader("test.txt"); // (3)
        } catch (IOException e) {
            log.warn("エラー:" + e); // (4)warnメソッドの記述

        }
    }
}

example.ExLog2.java

package example;

import org.apache.log4j.*;

public class ExLog2 {
  //(1)Loggerオブジェクトの生成
  static Logger log = Logger.getLogger(ExLog2.class.getName());
  void methodB() {
    int x = 20;
    if(x > 10) {
      log.info("変数は10以上です。");  //(2)infoメソッドの記述
    }
  }
}
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

<!-- (1)appenderの設定 -->
<appender name="FILE" class="org.apache.log4j.FileAppender">
  <param name="File" value="log.txt" />
  <!-- (2)layoutの設定 -->
  <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern"
           value="%d{yyyy/MM/dd} %p:%r:%c:%m%n" />
  </layout>
</appender>

<!-- (3)categoryの設定 -->
<category name="example">
  <priority value="info" />
  <appender-ref ref="FILE" />
</category>

</log4j:configuration>

log4j.xml の配置はカレントパスらしい

実行結果 log.txt

2009/07/26 WARN:0:example.ExLog1:エラー:java.io.FileNotFoundException: test.txt (指定されたファイルが見つかりません。)
2009/07/26 INFO:15:example.ExLog2:変数は10以上です。

log4j.xml の 配置場所を変えてみよう

    public static void main(String[] args) {
        // (2)設定ファイルの読み込み
        DOMConfigurator.configure("c:/aaa/log4j.xml");

指定した場所XMLファイルを配置すれば、OKだったみたいだ。


20090726 カテゴリーについて

Log4Jは「カテゴリー階層ロガー」と呼ばれるている。つまり、ロガーを使う時の名前が、「カテゴリー」であるが、それが「階層」になっているのが大きな特徴である。

通常は、複数のソース(クラス)で一つのアプリケーションが構築されている。その際に「チェックしたいソース(クラス)」だけをロギングするなんてことが出来るのである。とすれば、何かのサブモジュール(複数ファイル・クラス)だけをロギングできたらイイよな...と考えるのは自然で、ここらへんを「カテゴリー階層」化してうまくまとめることが出来るのである。継承モデルのようなもんである。

で、Log4J は「Java のため」の実装である。Java は言うまでもなく、OOPだ。というわけで、別に強制するわけではないが、この「カテゴリー」には、「そのクラスの完全修飾名を使え!」という重要なアドバイスがあるのである。要するに「ロギングのカテゴリー=クラス階層」でやるのがイイよ、と薦めていてくれているのである。なるほど頷けるご意見である。一応ここではそれでやっていこう。現実の開発でも、これが不便なケースって考えにくいしね(逆に言うと、これが「不便!」という時は、クラスの切り分けが間違ってない?)。

 

http://www.nurs.or.jp/~sug/soft/log4j/log4j1.htm

 


20090726 設定ファイルの読み込み

Log4jはクラスパスに log4j.xml 又は log4j.properties が含まれる場合、それらを設定ファイルとしてロードするため、各Webアプリケーションの WEB-INF/classes 以下に それらのファイルを配置する方法が最も一般的らしい。

サーブレット・コンテナが Tomcat の場合は、CATALINA_OPTS 環境変数へ log4j.configuration システムプロパティを設定する方法もある。Tomcat の起動スクリプトでは、CATALINA_OPTS を java コマンドの起動オプションとして与えるようになっているため、この環境変数へ log4j.configuration を設定すればシステムプロパティとして反映されます。以下は Unix環境における例です。

export CATALINA_OPTS="-Dlog4j.configuration=file:///home/foo/log4j.xml"

ただ、この設定はすべてのWebアプリケーションで有効になるため、最初に示したとおり基本的には WEB-INF/classes 以下に設定ファイルを格納する方法が良いらしい。


20090726 カテゴリーの使い分け

最初の例で、name=example としてカテゴリを設定した
<!-- (3)categoryの設定 -->
<category name="example">
  <priority value="info" />
  <appender-ref ref="FILE" />
</category>

全ての階層に共通的な設定はROOTで行うことができる。ROOTのきり方

<root>
    <level value ="warn" />
    <appender-ref ref="FILE" />
</root>

ROOTとして アペンダーはFILEを使う…という意味である。

log4j.xml 全体は以下のとおりとなる

 

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

<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>

<!-- (1)appenderの設定 -->
<appender name="FILE" class="org.apache.log4j.FileAppender">
  <param name="File" value="log.txt" />
  <!-- (2)layoutの設定 -->
  <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern"
           value="%d{yyyy/MM/dd} %p:%r:%c:%m%n" />
  </layout>
</appender>


<appender name="CON" class="org.apache.log4j.ConsoleAppender">
  <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern"
           value="%d{yyyy/MM/dd} %p:%r:%c:%F-%L:%m%n" />
  </layout>
</appender>


<!-- (3)categoryの設定 -->
<category name="example.ExLog1">
  <appender-ref ref="FILE" />
</category>


<root>
    <level value ="all" />
    <appender-ref ref="CON" />
</root>


</log4j:configuration>

 

置換え文字
置換え文字
内容
%c
ログ生成が行われたカテゴリ名を出力します。

%d

ログ生成の日時を指定します。%d{yyyy/mm/dd}など細かく指定できます。
%F
ログ生成をおこなったファイル名。
%L
ログ生成を行った行番号を出力します。
%m
ロギングイベントのメッセージを出力します。

%M

ログ生成が行われたメソッド名を出力します。
%n
改行
%p
ログ生成の優先度を出力します。
%r
アプリケーションを実行してからログ生成が行われるまでの経過時間を出力します。
%t
ログ生成が行われたスレッド名を出力します。

 

http://www.okisoft.co.jp/esc/log4j/universal/A6.html

 

 


戻る