2013-02-19 5 views
3

클래스의 메서드에 대한 로깅을 해제하고 싶습니다. 아래 참조 :log4j를 사용하여 메서드를 필터링하십시오.

.

# This works and nothing gets logged by A 
log4j.category.com.mypackage.A=off 

.

#this does not work. (I am trying to switch off only the static method) 
log4j.category.com.mypackage.A.aaa=off 

메소드를 기준으로 스위치를 끄면 (로그 수준 변경) 알 수 있습니까?

감사

참고 : 당신이 무엇을 할 수 있는지

+0

당신은 측면 중심의 홍보를 찾고 있습니다 프로그래밍. log4j를 현재 상태로 사용하면이 작업을 수행 할 수 없습니다. –

+0

안녕 Zo72 당신이 내게 간단한 예제를 어떻게 기록 할 수 있습니까? MyQuestion (http://stackoverflow.com/questions/14973901/how-to-log-my-java-program-flow-in-database) – Ameer

+0

@ameer too ...다른 사람들이 이미 귀하의 질문에 대답했습니다. – Zo72

답변

1

나는 이것을 할 가능성에 대해 몰라.

그럼에도 불구하고 클래스 및 메소드 이름 (PatternLayout 참조)을 포함하도록 로깅을 구성하고보고 싶은 항목을 포함/제외하려면 'grep'과 같은 다른 도구로 로그 파일을 후속 처리하십시오.

성능 문제로 인해 클래스 및 메소드 이름을 기록하지 않는 것이 좋지만 관련성이없는 경우 일 수 있습니다.

+0

@FvVaBe 그 우수한 측면 생각 덕분에 많은 – Zo72

3

(코드가 이미 나는 단지 설정 파일의 기존의 log4j를 변경하려면 살고 있기 때문에 그건) 나는 코드를 변경하지 않으 각 메소드마다 하나씩 두 개의 서로 다른 로거가 있습니다.

private static final Logger logAAA = Logger.getLogger("some.logger.name.for.AAA"); 
private static final Logger logBBB = Logger.getLogger("some.other.name.for.BBB"); 

그런 다음 구성에 서로 다른 로그 수준을 정의하십시오.

+0

델리 마놀 즈 감사하지만 코드 변경이 필요하며 코드를 변경하지 않고는 – Zo72

+0

불가능합니다. –

3

실제로는 로거 이름을 확인한 다음 호출 방법을 확인하는 특정 Filter을 구현하여 실제로 가능합니다. 필터는 LoggingEvent을 수신하며 클래스 및 메소드 이름이있는 LocationInfo을 검색 할 수 있습니다.

매우 비효율적 일 수있는 스택 추적에 리플렉션을 사용한다는 점에 유의하십시오. 특히 LocationInfo을 검색하기 전에 로거 이름 을 먼저 확인해야합니다. 그러면 필요한 경우에만 리플렉션을 수행하십시오.

필터 구성은 XML Log4j 구성 파일을 통해서만 가능합니다.

빠른 구현 :

필터 클래스 :

public class MethodBasedFilter extends Filter { 

    @Override 
    public int decide(LoggingEvent event) { 
     if (event.getLoggerName().equals(LoggingWithMethodFiltering.class.getCanonicalName())) { 
      if (event.getLocationInformation().getMethodName().equals("filteredMethod")) { 
       return Filter.DENY; 
      } 
     } 
     return Filter.NEUTRAL; 
    } 
} 

필터링 된 클래스 :

public class LoggingWithMethodFiltering { 
    private static final Logger LOG = Logger.getLogger(LoggingWithMethodFiltering.class); 

    public static void unfilteredMethod() { 
     LOG.info("I am not filtered"); 
    } 

    public static void filteredMethod() { 
     LOG.info("I am filtered and will never appear"); 
    } 

    public static void main(String[] args) { 
     unfilteredMethod(); 
     filteredMethod(); 
    } 
} 

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"> 
     <param name="threshold" value="trace" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p|%-20.20t|%d{HH:mm:ss,SSS}|%20.30c{1} %25.25F:%-4L - %20.20M - %m%n" /> 
     </layout> 
     <filter class="MethodBasedFilter" /> 
    </appender> 

    <root> 
     <level value="trace" /> 
     <appender-ref ref="Console" /> 
    </root> 

</log4j:configuration> 
+0

이 코드를 변경하지 않고도 얻을 수 있다면 나는 XML log4j 구성 파일을 사용하여 기쁘게 생각합니다 ... 당신은 당신의 대답을 풍요롭게하고 설명 할 수 – Zo72

+0

제안 된 솔루션의 구현을 추가했습니다. 물론 상자 밖의 필터가 없기 때문에 최소한 필터 구현을 추가해야합니다. 환경에 따라 클래스 로딩 문제 (예 : Log4j가 응용 프로그램 서버에서 제공되는 경우)를 피하려면 응용 프로그램 자체가 아니라 Log4j jar 옆에 jar 파일을 넣어야 할 수도 있습니다. –

+0

노력에 감사하지만 그렇지 않습니다. 새로운 코드가 필요하기 때문에 좋은 ... – Zo72

관련 문제