Log4j 虎の巻
プロパティ:
Log4j.propertiesもしくはLog4j.xmlはクラスパスの通っているディレクトリに置くと、log4jによって読み込まれる。
よって、クラスパスの通っているディレクトリ(この場合、libディレクトリ等にクラスパスを通しておくのが無難か)に配置する。
EclipseとAntの両方から読み込める位置におくと(もしくは両者をそのように設定すると)、使いやすい。
(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 LoggerにAppenderを追加する。
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 *****
※
ConsoleAppenderとWriterAppenderの両方から出力された内容がともにコンソール上に表示されていることが確認できる。