gpt4 book ai didi

java - 基于事件的每个记录器的 Log4j 过滤

转载 作者:行者123 更新时间:2023-11-29 09:26:07 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com