ログメッセージをWebサービスに書き込むためにlog4jでAsyncAppenderを使用する方法は? AsyncAppender を拡張する独自のアペンダーを作成するか、カスタム アペンダーを AsyncAppender にアタッチする必要がありますか? 2 番目の選択が正しければ、AsyncAppender オブジェクトをどこに取得すればよいですか? 例はありますか?
3 に答える
実際のアペンダーを参照する 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>
log4j.AsyncAppender を使用したかったのですが、log4j.property ファイルで他のアペンダーをアタッチするセッター メソッドが見つかりませんでした。そのため、log4j.AsyncAppender クラスを拡張し、セッターを追加して他のアペンダーを追加しました。これにより、メイン プログラム スレッドが log4j のロギング操作から独立できるようになりました。詳細は以下。
log4j エントリ:
log4j File Appender、「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
ビジネスに必要なロガー「com.business」を定義し、log4j AsyncAppender を拡張するカスタム クラス com.log.AsyncAppenderHelper を介して、前のステップのファイル アペンダー「fileAppender」を log4j AsyncAppender にアタッチします。
log4j.logger.com.business=DEBUG,asyncLog
log4j.appender.asyncLog=com.log.AsyncAppenderHelper
log4j.appender.asyncLog.appenderFromLogger=com.noPath
log4j.AsyncAppender を拡張する Java クラス com.log.AsyncAppenderHelper は、クラスパスで使用できます。
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));
}
}
}
私自身の質問に答えます。
log4j 構成ファイル (通常は log4j.xml または log4j.properties) で、実際のアペンダーを参照する AsyncAppender を定義する必要があります (私の場合のように独自に定義されたクラスである可能性があります)。
そこで、AppenderSkeleton を拡張し、3 つの抽象メソッドを実装する WebServiceAppender クラスを作成しました。主なメソッドは、Web サービスに接続してすべての情報を送信する「追加」です。それでおしまい。