2012-06-20 37 views
21

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

答えて

-4

私自身の質問に答える。

log4j設定ファイル(通常はlog4j.xmlまたはlog4j.properties)では、実際のアペンダを参照するAsyncAppenderを定義する必要があります(これは私の場合のように独自の定義されたクラスかもしれません)。

私はAppenderSkeletonを拡張し、3つの抽象メソッドを実装するWebServiceAppenderクラスを作成しました。主な方法は、Webサービスに接続してすべての情報をWebサービスに送信する「追加」です。それでおしまい。

+19

他のユーザーのためのサンプルコードを入力してください。ありがとう – philipp

+2

あなたはコードまたは数行を提供してくださいできますか? –

35

実際のアペンダーを参照するlog4j設定ファイルにAsyncAppenderを追加します。デモ用 :のlog4j.xml

<?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> 
+3

パフォーマンス上の理由から、常にルートの優先度をより高いレベルに制限する方がよいです。 http://stackoverflow.com/a/13144054/603516を参照してください。 – Vadzim

+2

同じ例をlog4j.propertiesファイル形式で提供できますか? –

+0

行番号が表示されません – fudy

9

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

のlog4jエントリ:

は、log4jのファイルアペンダとロガー 'com.noPath' を定義する 'fileAppender'。ロガーパスが重要ではないことに注意してくださいので、名「com.noPath」

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

はに、ビジネスニーズが、「com.business」、前のステップ、「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を拡張するカスタムクラス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)); 
     } 

    } 
} 
+2

log4j.propertiesで非同期アペンダーを使用する方法 – hudi

+0

注意深く、これは簡単に壊れることがあります。私はこれを試しましたが、PropertyConfiguratorはアペンダーを削除し、処理中にそれらを再追加します。私のAsyncAppenderHelperはクローズドアペンダで終了しました。このため、DomConfigurator(xml)を使用して使用する必要があります。 –

+1

@AlanYackel log4j.propertiesでの使用方法はありませんか?私はxmlファイルを使用することができません – hudi

関連する問題