java - Log4j 1.2 多级过滤

标签 java log4j

顺便说一句,这是 log4j 1.2。

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

   <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 开始,这样我就可以接受警报 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>

所以我成功地在所有列出的日志中获取了我的警报日志(很多工作都是徒劳的,因为 root 已经在 INFO)。但我真正想要的是现在在我的新附加程序中获取信息,只有来自一个特定的类。

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

最佳答案

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

<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 或更高级别。

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

关于java - Log4j 1.2 多级过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17076827/

相关文章:

java - 使用 try 和 catch 字符串输入

java - 多个具有相同 log4j 的 weblogic 受管节点会导致文件锁定吗?

java - 如何在 Glassfish 3 中为每个部署的应用程序配置 log4j?

apache-spark - 如何停止在 Spark 控制台上显示 INFO 消息?

java - Apache POI : Create a cell with type number, 但为空

java - 在 Pageable 中传递到 Spring Controller 的排序将方向附加到属性名称,导致 SQL 错误

java - 单元测试时出错

java - 如何在折叠工具栏中设置导航箭头并设置 Onclicklistener

java - 将 Hibernate 持久对象转换为 SQL Insert 语句

java - Log4j 以编程方式设置 SMTP 设置并不完全有效