2012-06-20 3 views
21

로그 메시지를 웹 서비스에 기록하기 위해 log4j에서 AsyncAppender를 사용하는 방법은 무엇입니까? AsyncAppender를 확장하거나 AsyncAppender에 사용자 정의 appender를 연결하는 자체 Appender를 만들어야합니까? 두 번째 선택 사항이 맞으면 AsyncAppender 객체를 어디서 가져야합니까? 어떤 예가 있습니까?log4j에서 AsyncAppender를 사용하는 방법은 무엇입니까?

답변

-4

내 질문에 답해주세요.

log4j 설정 파일 (일반적으로 log4j.xml 또는 log4j.properties)에서 실제 appender를 참조하는 AsyncAppender를 정의해야합니다 (내 경우처럼 우리 자신의 정의 된 클래스 일 수 있음).

그래서 AppenderSkeleton을 확장하고 3 가지 추상 메소드를 구현하는 WebServiceAppender 클래스를 작성했습니다. 주된 방법은 웹 서비스에 연결하고 모든 정보를 웹 서비스에 보내는 "추가"입니다. 그게 전부 야.

+19

다른 사용자에게 예제 코드를 제공해주십시오. 덕분에 – philipp

+2

코드 또는 몇 줄을 제공해 주실 수 있습니까? –

35

실제 appender를 참조하는 log4j 구성 파일에 AsyncAppender를 추가하십시오. 데모 : 추가 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을 사용하고 싶었에서 펜더 콘솔하지만 log4j.property 파일에서 다른 펜더를 연결하는 모든 setter 메소드를 찾을 수 없습니다. 그래서 우리는 log4j.AsyncAppender 클래스를 확장하고 setter를 추가하여 다른 appender를 추가했습니다. 이것은 주 프로그램 스레드가 log4j의 로깅 작업과 독립적 이도록 도왔습니다. 아래의 내용.

의 log4j 항목 :

는 log4j에 파일이 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', 이전 단계, 'fileAppender'의 파일 어 펜더를 연결 로거를 정의 log4j에 AsyncAppender

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

log4j.AsyncAppender 연장 자바 클래스를 확장 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에서 비동기식 appender를 사용하는 좋은 예 – hudi

+0

조심스럽게, 이것은 쉽게 깨질 수 있습니다. 나는 이것을 시도했지만 PropertyConfigurator가 appenders를 제거하고 처리 할 때 다시 추가한다. 내 AsyncAppenderHelper가 폐쇄 된 appender로 끝났습니다. 그래서 DomConfigurator (xml)를 사용해야합니다. –

+1

@AlanYackel log4j.properties와 함께 사용하는 방법은 없습니다. 나는 xml 파일을 사용할 수 없다. – hudi

관련 문제