Log4j 1.2多级过滤

时间:2013-06-12 23:03:24

标签: java log4j

BTW,这是log4j 1.2。

我的应用程序需要在每次创建警报时记录,我们希望在INFO级别执行此操作。我们的根记录器的优先级设置为INFO。到现在为止还挺好。我们为特殊需求添加了几个appender,包括stadard CONSOLE appender和server.log appender(以及其他)。我已经使用console和server.log appenders配置了根记录器。在这一点上也很好。

   <root>
      <priority value="INFO"/>
      <appender-ref ref="CONSOLE"/>
      <appender-ref ref="server"/>
      <appender-ref ref="logfileForErrors"/>
   </root>

现在我需要一个新的appender来获取通常发送到server.log的所有ERROR / WARNING / FATAL,以及特定类的INFO。我开始使用INFO阈值的追加器,所以我可以接受警报信息日志:

<appender name="logfileForAlarmsAndOther" class="org.apache.log4j.RollingFileAppender">
    <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
    <param name="file" value="${biomerieux.data}/simon/logs/vilink.log" />
    <param name="append" value="true" />
    <param name="threshold" value="INFO" />
    <param name="maxBackupIndex" value="1" />
</appender>

然后我为我的班级定义了一个记录器:

    <logger name="my.root.path.service.alert.AlertService" additivity="false">
        <level value="info" />
        <appender-ref ref="logfileForAlarmsAndOther"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="server"/>
    </logger>

所以我成功地在所有列出的日志中获取了警报日志(由于根目录已经在INFO,所以很多工作都没有。)但我真正想要的是现在只在我的新appender 获取INFO,如果它们来自一个特定的类。

我不确定我是否已经很好地描述了这一点,而且我不是log4j精明的,所以如果需要请请澄清。这个难题与将我的新appender限制为WARNING和更高版本有关,除了我想要来自特定类的INFO。此类的这些INFO也应该转到父loggeres通常会记录INFO的每个appender。我可能会感到困惑,但似乎我可以想到在log4j 1.2中使用自定义过滤器。

1 个答案:

答案 0 :(得分:1)

我解决这个问题的方法是消除特定类的额外子记录器,并使用appender中的一系列过滤器来处理:

<appender name="logfileForAlarmsAndOther" class="org.apache.log4j.RollingFileAppender">
    <errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
    <param name="file" value="${biomerieux.data}/simon/logs/vilink.log" />
    <param name="append" value="true" />
    <param name="threshold" value="INFO" />
    <param name="maxBackupIndex" value="1" />
    <filter class="org.apache.log4j.varia.StringMatchFilter">
        <param name="StringToMatch" value="MyStringToMatch" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.LevelRangeFilter">
        <param name="LevelMin" value="WARN" />
    </filter>
</appender>

因此全局阈值是INFO,它立即接受与String匹配的INFO,但其他任何东西都受第二个过滤器的约束,该过滤器将剩余的消息限制为WARN或更高。

这样做的缺点是我必须在日志消息中引入一个独特的可搜索字符串。