Log4j 虎の巻

 

プロパティ:

Log4j.propertiesもしくはLog4j.xmlはクラスパスの通っているディレクトリに置くと、log4jによって読み込まれる。

よって、クラスパスの通っているディレクトリ(この場合、libディレクトリ等にクラスパスを通しておくのが無難か)に配置する。

EclipseAntの両方から読み込める位置におくと(もしくは両者をそのように設定すると)、使いやすい。

(Ant build.xml)

    <property name="BTS.LIB" value="${BTS.WEB}/WEB-INF/lib"/>

             

    <property name="BTS.LOG" value="${BTS.LIB}/log4j-1.2.14.jar"/>

             

    <path id="class.path">

        <pathelement path="${BTS.LOG}"/>

             

(Eclipse Properties)

 

 

Log4jの出力をWriterにリダイレクト:

Log4jの出力先をファイルではなくアプリケーションのどこか(例えばフォームのテキストエリア)などにリダイレクトしたい場合などに、WriterAppenderを介して以下の手順にて実現することができる。

@     Loggerを作成する。

A     PatternLayoutを作成、変換文字列を指定する。

B     独自のWriterを実装し、作成する。その際、Writer.writeメソッドに具体的に実行したい処理を実装する(もしくは、委譲コードを書く)。

C     PatternLayoutに変換文字列を指定する。

D     Appenderを作成し、PatternLayoutと独自Writerを指定する。

E     LoggerAppenderを追加する。

F     ログ出力を実行する。

 

例)WriterAppenderに渡したWriterが受け取った出力内容を、System.outにリダイレクト

AppMainクラス:

package com.aksys.log4j.main;

 

import java.io.Writer;

 

import org.apache.log4j.Appender;

import org.apache.log4j.Logger;

import org.apache.log4j.PatternLayout;

import org.apache.log4j.WriterAppender;

 

import com.aksys.log4j.hello.AppHello;

import com.aksys.log4j.hello.AppHelloWriter;

 

public class AppMain {

 

       private static Logger logger = Logger.getLogger(AppMain.class);

       private static PatternLayout layout = new PatternLayout();

       private static Writer writer = new AppHelloWriter();

       private static Appender appender;

      

       /**

        * @param args

        */

       public static void main(String[] args) {

              AppMain main = new AppMain();

              layout.setConversionPattern("[%d{HH:mm:ss}] %p: %m%n");

              appender = new WriterAppender(layout, writer);

              logger.addAppender(appender);

              main.process();

       }

      

       public void process() {

              logger.info("***** Application Start *****");

              logger.debug("***** Debug Start *****");

              AppHello app = new AppHello();

              app.sayHello();

              logger.debug("***** Debug End *****");

              logger.info("***** Application End *****");

       }

 

}

 

AppHelloクラス:

package com.aksys.log4j.hello;

 

import org.apache.log4j.Logger;

 

public class AppHello {

      

       private static Logger logger = Logger.getLogger(AppHello.class);

      

       private String hello;

      

       public AppHello() {

              this.hello = "Hello World";

       }

      

       public void sayHello() {

              logger.debug("Before hello");

              logger.info(hello);

              logger.debug("After hello");

       }

 

       public String getHello() {

              return hello;

       }

 

       public void setHello(String hello) {

              this.hello = hello;

       }

      

 

}

 

AppHelloWriterクラス:

package com.aksys.log4j.hello;

 

import java.io.IOException;

import java.io.Writer;

 

public class AppHelloWriter extends Writer {

 

       @Override

       public void write(char[] cbuf, int off, int len) throws IOException {

              System.out.println("This is from AppHelloWriter: "

                            + new String(cbuf, off, len));

       }

 

       @Override

       public void flush() throws IOException {

       }

 

       @Override

       public void close() throws IOException {

       }

 

}

※例では、AppHelloWriter.writeの出力先をSystem.outにしているが、ここにオブザーバパターンを適用し、Form等にリダイレクトすることが可能。

 

log4j.properties:

#log4j.logger.com.aksys.log4j.main=INFO, A1

#log4j.logger.com.aksys.log4j.hello=DEBUG, A1

log4j.logger.com.aksys.log4j=INFO, A1

 

 

# A1 is set to be a ConsoleAppender.

log4j.appender.A1=org.apache.log4j.ConsoleAppender

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=[%d{HH:mm:ss}] %p: %F %m%n

 

 

(出力結果)

This is from AppHelloWriter: [23:48:04] INFO: ***** Application Start *****

 

[23:48:04] INFO: AppMain.java ***** Application Start *****

This is from AppHelloWriter: [23:48:04] INFO: ***** Application End *****

 

[23:48:04] INFO: AppMain.java ***** Application End *****

 

     ConsoleAppenderWriterAppenderの両方から出力された内容がともにコンソール上に表示されていることが確認できる。