Java 每个记录器的Log4j过滤,基于事件
我想根据日志消息的内容过滤来自第三方库特定组件的日志事件。我只希望在日志事件由特定记录器生成时应用此筛选:“org.restlet.Component.LogService”。过滤本身只是与日志事件消息的基本匹配 我有一个中心AsyncAppender,它记录到多个Appender。在来自LogService的事件没有被过滤掉的情况下,我希望它们能像现在一样被处理——也就是说,被发送到AsyncAppender。我不想向AsyncAppender添加过滤器,因为这似乎效率非常低(我不需要过滤所有事件,只需要过滤来自LogService logger的事件) 因此,我尝试将LogService logger与自定义Appender关联,后者又与自定义筛选器关联:Java 每个记录器的Log4j过滤,基于事件,java,log4j,Java,Log4j,我想根据日志消息的内容过滤来自第三方库特定组件的日志事件。我只希望在日志事件由特定记录器生成时应用此筛选:“org.restlet.Component.LogService”。过滤本身只是与日志事件消息的基本匹配 我有一个中心AsyncAppender,它记录到多个Appender。在来自LogService的事件没有被过滤掉的情况下,我希望它们能像现在一样被处理——也就是说,被发送到AsyncAppender。我不想向AsyncAppender添加过滤器,因为这似乎效率非常低(我不需要过滤所有
<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:错误:没有为名为[filtered]的追加器设置布局
…告诉我我的设计有问题:我认为我的自定义appender不应该关心布局,因为它实际上只需要传递或不传递日志事件。此外,这种方法需要两个自定义类,其中一个(mystuff.FilteredAppender)根本不添加任何值——它只是用来保存自定义过滤器
我想做一些更干净的事情,比如
<logger name="org.restlet.Component.LogService">
<filter class="mystuff.EventFilter"/>
</logger>
…但log4j框架显然不支持这一点
是否有一种很好的干净方法可以按照我想要的方式进行事件过滤?这描述了一种我能够使用的解决方案。不得不使用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>
但如果有人知道更好的方法,我当然会感兴趣。:-) Log4J有一个提供LoggerMatchFilter
,用于过滤记录器名称的。设置记录器名称以及接受还是拒绝(默认为接受)
在过滤器的decise
方法中,它将记录器名称与LoggingEvent对象.getLoggerName()
进行比较,以确定是否相等。这是一个令人惊讶的简单和明显的过滤器,我很惊讶它不是默认的Log4j
或者,如果您只是想让第三方库安静下来,我发现以下内容非常有用:
<!-- LOGGER NEUTER -->
<logger name="org.apache"><level value="WARN"/></logger>
<logger name="org.springframework"><level value="WARN"/></logger>