在log4cxx中为不同的文件写入不同的级别

时间:2014-08-19 21:13:30

标签: log4cxx

我希望每个日志级别的日志消息转到另一个文件。从名称来看,LevelMatchFilter看起来就像我想要的那样,除了它似乎没有从不同的级别过滤任何东西。

我认为以下属性应该使用LevelRangeFilter来实现。但是,无论级别如何,发送到全局记录器的任何内容都将在INFO.log中结束。

log4j.rootLogger = OFF

# Global level based logs
log4j.logger.global = ALL, Info

log4j.appender.Info=org.apache.log4j.FileAppender
log4j.appender.Info.File=Logs/INFO.log
log4j.appender.Info.layout=org.apache.log4j.PatternLayout
log4j.appender.Info.layout.ConversionPattern=%d [%p]  %m%n
log4j.appender.Info.filter.a=org.apache.log4j.filter.LevelRangeFilter
log4j.appender.Info.filter.a.LevelMin=info
log4j.appender.Info.filter.a.LevelMax=info
log4j.appender.Info.filter.a.AcceptOnMatch=true

我还尝试将INFO用于LevelMinLevelMax的值,但结果相同。

我做错了什么?

作为一个附带问题,有没有办法在使用属性文件时打开log4cxx配置的调试?我在使用xml文件时找到了一个选项,但没有明显的属性翻译(debug=truelog4j.debug=true)和任何效果。

1 个答案:

答案 0 :(得分:0)

从log4cxx 0.10开始(可能更早),属性格式不支持过滤器。因此,需要XML配置(或编程配置)。

<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
  <appender name="Info" class="org.apache.log4j.FileAppender">
    <param name="file" value="Logs/INFO.log" />
    <param name="append" value="false" />

    <!-- If this filter accepts the message, it will be printed.  That happens if this is an info message -->
    <filter class="org.apache.log4j.filter.LevelMatchFilter">
      <param name="levelToMatch" value="INFO" />
      <param name="acceptOnMatch" value="true" />
    </filter>
    <!-- If it is not an info message, this filter will reject it -->
    <filter class="org.apache.log4j.filter.DenyAllFilter"/>

    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d [%p] %m%n" />
    </layout>
  </appender>
  <root>
    <priority value="off" />
  </root>
  <logger name="global">
    <priority value="all" />
    <appender-ref  ref="Info" />
  </logger>
</log4j:configuration>