2012-10-12 151 views
3

我想问一些关于log4j的问题。我在activemq上有log4j的这个配置文件。我的问题是我想记录每个类中的所有INFO级别的消息,但是我想将所有来自“TransportConnection”类的DEBUG级别消息记录到不同的文件中,并且同时记录所有更大的消息或者等于WARN级别,传递给rootLogger。log4j隔离某个级别

该配置的问题是,我在rootLogger中记录来自“TransportConnection”类的INFO级别消息。我只想将WARN和以上级别传递给rootLogger。

我不想为“out”appender设置阈值,因为我想从其他类获取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

您可以编写自己的自定义过滤器。我认为,实现可以是类似的东西:

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; } 
} 

请注意,如果你改变“的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>