2012-06-20 101 views
21

如何在log4j中使用AsyncAppender將日誌消息寫入Web服務?我應該創建自己的Appender來擴展AsyncAppender,或者只是將自定義的appender附加到AsyncAppender上?如果第二種選擇是正確的,我應該在哪裏使用AsyncAppender對象?有沒有例子?如何在log4j中使用AsyncAppender?

回答

-4

回答我自己的問題。

在log4j配置文件中(通常是log4j.xml或log4j.properties),我們應該定義AsyncAppender,它會引用一個真正的appender(它可能是我們自己定義的類,就像我的情況一樣)。

所以我寫了一個擴展AppenderSkeleton並實現3個抽象方法的WebServiceAppender類。主要方法是「追加」,它連接到Web服務並將所有信息發送給它。而已。

+19

請爲其他用戶提供您的示例代碼。謝謝 – philipp

+2

你能否提供代碼或幾行? –

35

在log4j配置文件中添加AsyncAppender,它將引用一個真正的appender。 對於演示:將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

我們想用log4j.AsyncAppender,但找不到任何setter方法在log4j.property文件附加其他附加目的地。所以我們擴展了log4j.AsyncAppender類並添加了一個setter來添加其他appender。這有助於主程序線程獨立於log4j的日誌操作。下面的細節。

log4j的條目:

定義一個記錄器 'com.noPath' 與log4j的文件追加程序, '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通過自定義類com.log.AsyncAppenderHelper延伸的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)); 
     } 

    } 
} 
+2

不錯的例子如何在log4j.properties中使用異步appender – hudi

+0

小心,這可以很容易地打破。我試過這個,但PropertyConfigurator刪除了appender,並在處理時重新添加它們。我的AsyncAppenderHelper結束了一個封閉的appender。這就是爲什麼你需要使用DomConfigurator(xml)來使用它。 –

+1

@AlanYackel沒有選擇如何將它與log4j.properties一起使用?我不能使用XML文件 – hudi