我想根据日志消息的内容过滤来自第三方库的特定组件的日志事件。我只希望在特定记录器生成日志事件时应用此过滤:“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框架的支持。

有没有一种干净的方式按照我想要的方式进行事件过滤?

有帮助吗?

解决方案

留言板条目描述了我能够开展工作的解决方案。使用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有一个 Extras Library( JavaDoc)提供 LoggerMatchFilter ,以过滤Logger名称。您可以设置记录器名称以及是接受还是拒绝(默认为接受)。

在过滤器的 decision 方法中,它将记录器名称与 LoggingEvent object.getLoggerName()进行比较以获得相等性。这是一个非常简单明了的过滤器,我很惊讶Log4j默认不会出现。

或者,如果您只想安静第三方库,我发现以下内容非常有用:

<!-- LOGGER NEUTER -->
<logger name="org.apache"><level value="WARN"/></logger>
<logger name="org.springframework"><level value="WARN"/></logger>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top