我想根据日志消息的内容过滤来自第 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/