2012-10-12 4 views
3

log4j에서 질문하고 싶습니다. 나는 activemq에 log4j에 대한이 설정 파일을 갖고있다. 내 문제는 내가 갖고있는 모든 클래스의 모든 INFO 수준 메시지를 기록하려고하지만 "TransportConnection"클래스의 모든 DEBUG 수준 메시지를 다른 파일에 기록하고 동시에 더 큰 메시지 만 모두 기록하려고합니다. WARN 레벨과 동등한 값을 rootLogger에 보냅니다.log4j는 클래스에서 특정 레벨을 분리합니다.

이 구성의 문제점은 rootLogger의 "TransportConnection"클래스에서 INFO 레벨 메시지를 로깅한다는 것입니다. WARN 이상의 레벨 만 rootLogger에 전달하고 싶습니다.

"out"appender에 Threshold를 설정하고 싶지 않습니다. 왜냐하면 다른 클래스의 INFO 레벨 메시지를 원하기 때문입니다.

log4j.rootLogger=INFO,out 

# Log these warnings 
log4j.logger.org.apache.activemq.broker.BrokerRegistry=INFO 
log4j.logger.org.apache.activemq.broker.TransportConnection=DEBUG,tc 

# Standard logging 
log4j.appender.out=org.apache.log4j.RollingFileAppender 
log4j.appender.out.file=/var/lib/activemq/log/activemq.log 
log4j.appender.out.maxFileSize=10240KB 
log4j.appender.out.maxBackupIndex=100 
log4j.appender.out.append=true 
log4j.appender.out.layout=org.apache.log4j.PatternLayout 
log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n 

# Transport Connections logging 
log4j.appender.tc=org.apache.log4j.RollingFileAppender 
log4j.appender.tc.file=/var/lib/activemq/log/tc.log 
log4j.appender.tc.maxFileSize=10240KB 
log4j.appender.tc.maxBackupIndex=100 
log4j.appender.tc.append=true 
log4j.appender.tc.layout=org.apache.log4j.PatternLayout 
log4j.appender.tc.layout.ConversionPattern=%d [%t] %-5p %-30.30c{1} - %m%n 

답변

1

사용자 정의 필터를 작성할 수 있습니다. 당신이 "클래스 이름"변수를 "여기서 packageName"변수를 변경하는 경우 구현이 특정 패키지에 의해 필터 동일하게 나타날 것이라고는

public class MinLevelForParticularClassFilter extends Filter { 

    private boolean acceptOnMatch = false; 
    private Level level; 
    private String className; 

    @Override 
    public int decide(LoggingEvent event) { 
     if (this.className != null && this.level != null) { 
      if (event.getLocationInformation().getClassName().startsWith(className)) { 
       // this is event for specified class 
       if (!event.getLevel().isGreaterOrEqual(this.level)) { 
        // level of event is less than specified level 
        return Filter.DENY; 
       } 
      } 
     } 

     if (acceptOnMatch) { 
      return Filter.ACCEPT; 
     } else { 
      return Filter.NEUTRAL; 
     } 
    } 

    public boolean isAcceptOnMatch() { return acceptOnMatch; } 
    public void setAcceptOnMatch(boolean acceptOnMatch) { this.acceptOnMatch = acceptOnMatch; } 

    public Level getLevel() { return level; } 
    public void setLevel(Level level) { this.level = level; } 

    public String getClassName() { return className; } 
    public void setClassName(String className) { this.className = className; } 
} 

참고 : 나는 구현은 그런 일이 될 수 있다고 제안한다.

(필터 속성 파일 구성에 의해 지원되지 않는 때문에) XML의 log4j 구성 :

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="out" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="activemq.log" /> 
     <param name="MaxFileSize" value="10240KB" /> 
     <param name="MaxBackupIndex" value="100" /> 
     <param name="Append" value="true" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%-15.15t] %-5p %-30.30c{1} - %m%n"/> 
     </layout> 

     <!-- Apply filter to appender that's destined for root logger --> 
     <filter class="com.foo.log4j.filters.MinLevelForParticularClassFilter"> 
      <param name="Level" value="WARN" /> 
      <param name="ClassName" value="org.apache.activemq.broker.TransportConnection" /> 
      <param name="AcceptOnMatch" value="true" /> 
     </filter> 

    </appender> 

    <appender name="tc" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="tc.log" /> 
     <param name="MaxFileSize" value="10240KB" /> 
     <param name="MaxBackupIndex" value="100" /> 
     <param name="Append" value="true" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-5p %-30.30c{1} - %m%n"/> 
     </layout> 
    </appender> 

    <logger name="org.apache.activemq.broker.BrokerRegistry"> 
     <level value="INFO" /> 
    </logger> 
    <logger name="org.apache.activemq.broker.TransportConnection"> 
     <level value="DEBUG" /> 
     <appender-ref ref="tc" /> 
    </logger> 
    <root> 
     <priority value ="INFO" /> 
     <appender-ref ref="out" /> 
    </root> 
</log4j:configuration>