web-dev-qa-db-ja.com

log4jでAsyncAppenderを使用するには?

Webサービスにログメッセージを書き込むために、log4jでAsyncAppenderを使用する方法は? AsyncAppenderを拡張する独自のAppenderを作成するか、AsyncAppenderにカスタムアペンダーを添付するだけですか? 2番目の選択が正しい場合、AsyncAppenderオブジェクトはどこで取得する必要がありますか?例はありますか?

25
Sergey

実際のアペンダーを参照するlog4j構成ファイルにAsyncAppenderを追加します。デモの場合:log4j.xmlのコンソールアペンダーにasyncappenderを追加する

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration>
<appender name="console" class="org.Apache.log4j.ConsoleAppender">
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss aa} %t [%l] %m%n"/>
    </layout>
</appender>
<appender name="async" class="org.Apache.log4j.AsyncAppender">
    <param name="BufferSize" value="500"/>
    <appender-ref ref="console"/>
</appender>
<root>
    <priority value="all"></priority>
    <appender-ref ref="async"/>
</root>
</log4j:configuration>
41
deepakmodak

Log4j.AsyncAppenderを使用したかったのですが、log4j.propertyファイルに他のアペンダーをアタッチするためのセッターメソッドが見つかりませんでした。そこで、log4j.AsyncAppenderクラスを拡張し、セッターを追加して他のアペンダーを追加しました。これにより、メインプログラムスレッドがlog4jのログ操作に依存しなくなりました。以下の詳細。

log4jエントリ:

Log4jファイルアペンダー、「fileAppender」を使用してロガー「com.noPath」を定義します。ロガーのパスは重要ではないため、「com.noPath」という名前に注意してください。

log4j.logger.com.noPath=DEBUG,fileAppender
log4j.appender.fileAppender=org.Apache.log4j.RollingFileAppender
log4j.appender.fileAppender.File=c:/test.log

Log4j AsyncAppenderを拡張するカスタムクラスcom.log.AsyncAppenderHelperを介して、ビジネスに必要なロガー「com.business」を定義し、前のステップ「fileAppender」のファイルアペンダーをlog4j AsyncAppenderにアタッチします。

log4j.logger.com.business=DEBUG,asyncLog
log4j.appender.asyncLog=com.log.AsyncAppenderHelper
log4j.appender.asyncLog.appenderFromLogger=com.noPath

Java class com.log.AsyncAppenderHelperはlog4j.AsyncAppenderを拡張し、クラスパスで利用可能にします。

package com.log
import Java.util.Enumeration;
import org.Apache.log4j.Appender;
import org.Apache.log4j.AsyncAppender;
import org.Apache.log4j.Logger;

/*
 * This class helps configure to AsyncAppender from log4j as part of log4j.properties
 * You can inject other appenders to AsyncAppender using the AsyncAppenderHelper
 * This would free up the main program thread to be independent of log4j's logging operation
 * @Author http://www.linkedin.com/in/jobypgeorge
 */

public class AsyncAppenderHelper extends AsyncAppender{

    public AsyncAppenderHelper(){
        super();
    }

    public void setAppenderFromLogger(String name){
        Logger l = Logger.getLogger(name);

        Enumeration<Appender> e = l.getAllAppenders();

        while(e.hasMoreElements()){
             Appender a = e.nextElement();
             this.addAppender(a);
             System.out.println("The newAppender "+a.getName() +" attach status "+this.isAttached(a));
        }

     }
}
9
JobyPGeorge