java - 基于事件的每个记录器的 Log4j 过滤

标签 java log4j

我想根据日志消息的内容过滤来自第 3 方库的特定组件的日志事件。我只希望在特定记录器生成日志事件时应用此过滤:“org.reSTLet.Component.LogService”。过滤本身只是与日志事件消息的基本匹配。

我有一个记录到多个附加程序的中央 AsyncAppender。如果来自 LogService 的事件没有被过滤掉,我希望它们像现在一样被对待——也就是说,被发送到 AsyncAppender。我不想向 AsyncAppender 添加过滤器,因为这看起来非常低效(我不需要过滤所有事件,只需要过滤来自 LogService 记录器的事件)。

所以我尝试做的是将 LogService 记录器与自定义 Appender 相关联,后者又与自定义 Filter 相关联:

    <appender name="filtered" class="mystuff.FilteredAppender">
            <filter class="mystuff.EventFilter"/>
            <appender-ref ref="ASYNC"/>
    </appender>

    <logger name="org.restlet.Component.LogService">
            <appender-ref ref="filtered"/>
    </logger>

我目前得到的错误...

log4j:ERROR No layout set for the appender named [filtered].

...告诉我我的设计有问题:我认为我的自定义 appender 不应该关心布局,因为它实际上只需要传递或不传递日志事件。此外,这种方法需要两个自定义类,其中一个 (mystuff.FilteredAppender) 根本没有增加任何值(value)——它只是用来保存自定义过滤器。

我喜欢做一些更清洁的事情,比如......

    <logger name="org.restlet.Component.LogService">
            <filter class="mystuff.EventFilter"/>
    </logger>

...但这显然不受 log4j 框架的支持。

是否有一种干净利落的方式来按照我想要的方式进行事件过滤?

最佳答案

message board entry描述了我能够开始工作的解决方案。不得不使用 AsyncAppender 作为过滤器持有者似乎很遗憾,但看起来这是不创建新的自定义 Appender 的最佳选择。所以我最终得到:

    <appender name="filtered" class="org.apache.log4j.AsyncAppender">
            <filter class="mystuff.EventFilter"/>
            <appender-ref ref="ASYNC"/>
    </appender>

    <logger name="org.restlet.Component.LogService" additivity="false">
            <appender-ref ref="filtered"/>
    </logger>

但如果有人知道更好的方法,我当然会感兴趣。 :-)

关于java - 基于事件的每个记录器的 Log4j 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1429616/

相关文章:

java - 字符串连接的性能有多重要?

java - Log4j Windows 事件查看器日志记录

java - Elasticsearch不根据createdBy字段查询?

java - 术语 "restricted"在 Java 中是什么意思?

java - 未使用 log4j.properties 文件中提供的日志模式

java - 从命令提示符运行 jar 文件时如何在 log4j.properties 文件中指定日志文件位置

java - 请求跟踪记录器

java - 找不到记录器(log4j)的附加程序?

java - 我如何分离 <xsd :choice/> sub-elements into individual Collection properties using JAXB?

java - 包内包 Java