我想根据日志消息的内容过滤来自第三方库的特定组件的日志事件。我只希望在特定记录器生成日志事件时应用此过滤:“org.restlet.Component.LogService”。过滤本身只是对日志事件消息的基本匹配。
我有一个中央AsyncAppender,可以记录到多个appender。如果没有过滤掉来自LogService的事件,我希望它们与现在一样对待 - 也就是说,将其发送到AsyncAppender。我不想在AsyncAppender中添加过滤器,因为这看起来非常低效(我不需要过滤所有事件,只需要来自LogService记录器的事件)。
所以我试图将LogService记录器与自定义Appender相关联,后者又与自定义过滤器相关联:
<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没有为名为[filtered]的appender设置布局。
...告诉我我的设计有问题:我不认为我的自定义appender应该关心布局,因为它确实需要传递或不传递日志事件。此外,这种方法需要两个自定义类,其中一个(mystuff.FilteredAppender)根本不添加任何值 - 它仅用于保存自定义过滤器。
我喜欢做更清洁的事情......
<logger name="org.restlet.Component.LogService">
<filter class="mystuff.EventFilter"/>
</logger>
...但这显然不受log4j框架的支持。
有没有一种干净的方式按照我想要的方式进行事件过滤?
答案 0 :(得分:0)
此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>
但如果有人知道更好的方法,我当然会感兴趣。 : - )
答案 1 :(得分:0)
Log4J有一个Extras Library (JavaDoc)提供LoggerMatchFilter
来过滤Logger名称。您可以设置记录器名称以及是接受还是拒绝(默认为接受)。
在过滤器的decide
方法中,它将记录器名称与LoggingEvent object.getLoggerName()
进行比较以获得相等性。这是一个非常简单明了的过滤器,我很惊讶Log4j默认不会出现。
或者,如果您只想安静第三方库,我发现以下内容非常有用:
<!-- LOGGER NEUTER -->
<logger name="org.apache"><level value="WARN"/></logger>
<logger name="org.springframework"><level value="WARN"/></logger>