我创建了一个自定义过滤器,看起来像这样:
@Plugin(name = "EmptyMessageFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
public class EmptyMessageFilter extends AbstractFilter {
@PluginFactory
public static EmptyMessageFilter createFilter() {
return new EmptyMessageFilter();
}
...
}
log4j配置文件看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss.SSS}
</Property>
</Properties>
<!-- When filter is here it works -->
<Filters>
<EmptyMessageFilter/>
</Filters>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${LOG_PATTERN}"/>
<!-- When filter is here it does not work -->
<Filters>
<EmptyMessageFilter/>
</Filters>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="ConsoleAppender"/>
</Root>
</Loggers>
</Configuration>
当过滤器在控制台附加器内部配置时,它不工作,但当它在附加器外部时,它工作。根据这个https://logging.apache.org/log4j/2.x/manual/configuration.html#Loggers两者都应该工作。有什么提示吗?
像RegexFilter或BurstFilter这样的预定义过滤器在appender中也可以工作,但是我看不出我的自定义过滤器和预定义过滤器之间有什么区别。
2条答案
按热度按时间ws51t4hk1#
与Logback不同,Logback定义了一个单独的
Filter
和TurboFilter
接口,Log4j Core有一个Filter
接口,具有双重用途:filter(LogEvent)
方法用于以下情况:1.连接到附加器,
1.附加到附加器引用,
1.附加到记录器配置(如您的情况)。
1.剩下的
filter
方法只在你的过滤器是一个全局过滤器(直接连接到一个配置)时使用。您的
filter(LogEvent)
方法必须不正确地工作,因此出现问题。请注意,在这种情况下,您总是有一个消息(通常是ObjectMessage
,SimpleMessage
或ParameterizedMessage
类型),尽管此消息可能是可变的。mefy6pfw2#
我认为
log4j
无法识别xml中的哪个Filter
类,请尝试在标签中使用您的扩展Filter的完全限定类名。