为什么log4j过滤器在appender中不起作用

zpjtge22  于 2023-10-18  发布在  其他
关注(0)|答案(2)|浏览(128)

我创建了一个自定义过滤器,看起来像这样:

@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中也可以工作,但是我看不出我的自定义过滤器和预定义过滤器之间有什么区别。

ws51t4hk

ws51t4hk1#

与Logback不同,Logback定义了一个单独的FilterTurboFilter接口,Log4j Core有一个Filter接口,具有双重用途

  1. filter(LogEvent)方法用于以下情况:
    1.连接到附加器,
    1.附加到附加器引用,
    1.附加到记录器配置(如您的情况)。
    1.剩下的filter方法只在你的过滤器是一个全局过滤器(直接连接到一个配置)时使用。
    您的filter(LogEvent)方法必须不正确地工作,因此出现问题。请注意,在这种情况下,您总是有一个消息(通常是ObjectMessageSimpleMessageParameterizedMessage类型),尽管此消息可能是可变的。
mefy6pfw

mefy6pfw2#

我认为log4j无法识别xml中的哪个Filter类,请尝试在标签中使用您的扩展Filter的完全限定类名。

相关问题