Java 每个记录器的Log4j过滤,基于事件

Java 每个记录器的Log4j过滤,基于事件,java,log4j,Java,Log4j,我想根据日志消息的内容过滤来自第三方库特定组件的日志事件。我只希望在日志事件由特定记录器生成时应用此筛选:“org.restlet.Component.LogService”。过滤本身只是与日志事件消息的基本匹配 我有一个中心AsyncAppender,它记录到多个Appender。在来自LogService的事件没有被过滤掉的情况下,我希望它们能像现在一样被处理——也就是说,被发送到AsyncAppender。我不想向AsyncAppender添加过滤器,因为这似乎效率非常低(我不需要过滤所有

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

我有一个中心AsyncAppender,它记录到多个Appender。在来自LogService的事件没有被过滤掉的情况下,我希望它们能像现在一样被处理——也就是说,被发送到AsyncAppender。我不想向AsyncAppender添加过滤器,因为这似乎效率非常低(我不需要过滤所有事件,只需要过滤来自LogService logger的事件)

因此,我尝试将LogService logger与自定义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:错误:没有为名为[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>