1

顺便说一句,这是 log4j 1.2。

每次我们创建警报时,我的应用程序都需要记录,我们希望在 INFO 级别进行。我们的根记录器的优先级设置为 INFO。到目前为止,一切都很好。我们为特殊需求添加了几个附加程序,包括一个标准的 CONSOLE 附加程序和一个 server.log 附加程序(和其他)。我已经使用控制台和 server.log 附加程序配置了根记录器。到目前为止也很好。

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

现在我需要一个新的附加程序来获取通常进入 server.log 的所有 ERROR/WARNING/FATAL,以及特定类的信息。我从一个阈值为 INFO 的 appender 开始,因此我可以接受警报 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 中,所以很多工作都是徒劳的)。但我真正想要的是现在只有当它们来自一个特定的类时才能在我的新附加程序中获取信息。

我不确定我是否已经很好地描述了这一点,而且我不精通 log4j,所以如果需要,请要求澄清。这个难题与将我的新附加程序限制为 WARNING 和更大有关,除了我想要来自特定类的信息。并且此类的这些信息也应该发送到父记录器通常会记录信息的每个附加程序。我可能会感到困惑,但似乎自定义过滤器是我能想到的在 log4j 1.2 中工作的全部。

4

1 回答 1

3

我解决这个问题的方法是消除特定类的额外子记录器,并使用 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,它立即接受与字符串匹配的 INFO,但其他任何内容都受第二个过滤器的限制,它将剩余的消息限制为 WARN 或更高。

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

于 2013-06-13T21:21:33.697 回答