Java Log4j2自定义过滤器

Java Log4j2自定义过滤器,java,apache,log4j2,Java,Apache,Log4j2,我试图在Log4J2中实现和配置一个基于ThresholdFilter的定制过滤器,但打算做更多的工作。我见过关于自定义附加器的主题,它们遵循相同的插件注释语法,但没有找到关于自定义附加器的主题 MyCustomFilter.java(基于ThresholdFilter) log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <Configuration> <MyCustomFilter level="fatal"

我试图在Log4J2中实现和配置一个基于ThresholdFilter的定制过滤器,但打算做更多的工作。我见过关于自定义附加器的主题,它们遵循相同的插件注释语法,但没有找到关于自定义附加器的主题

MyCustomFilter.java(基于ThresholdFilter)

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

  <MyCustomFilter level="fatal" />

  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%c{5}.%M():%L] %m%n" />
    </Console>
  </Appenders>

  <Loggers>
    <Logger name="com.me.test.logger" level="info" additivity="false">
      <AppenderRef ref="STDOUT" />
    </Logger>

    <!-- Root Logger -->
    <Root level="warn">
      <AppenderRef ref="STDOUT" />
    </Root>
  </Loggers>

</Configuration>
配置语法似乎与Apache文档中的语法相匹配,并模仿ThresholdFilter(一个可用的、提供的过滤器)。如果如图所示将其作为上下文级筛选器放置,则不会看到任何错误,但不会调用或应用该筛选器

如果我将自定义筛选器标记移动到Appender中(这在开箱即用筛选器中是可能的),我会得到
2015-03-24 16:20:11713错误AppenderRef包含无效元素或属性“MyCustomFilter”

基于log42j核心源代码中的示例,我认为这会起作用


我做错了什么?

能否显示配置的第一行,即
元素

您可以指定
使log4j的内部日志显示在控制台上,这可能有助于解决问题

也许log4j在找到你的插件时遇到了麻烦

编译插件时,会创建一个序列化插件列表文件。此文件包含插件名称和二进制格式的类名。如果此文件包含在包含插件类的jar中,log4j可以找到插件。帮助log4j找到插件的另一种方法是指定
packages
属性图文件:


有关更多详细信息,请参阅PluginManager如何尝试查找插件。

为将来的读者关闭循环。添加packages属性似乎有助于PluginManager查找我的筛选器。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

  <MyCustomFilter level="fatal" />

  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%c{5}.%M():%L] %m%n" />
    </Console>
  </Appenders>

  <Loggers>
    <Logger name="com.me.test.logger" level="info" additivity="false">
      <AppenderRef ref="STDOUT" />
    </Logger>

    <!-- Root Logger -->
    <Root level="warn">
      <AppenderRef ref="STDOUT" />
    </Root>
  </Loggers>

</Configuration>
public class LoggingRunner {

    public static void main(String[] args) {
        Logger logger = LogManager.getLogger("com.me.test.logger");

        logger.fatal("Fatal");
        logger.error("Error");
        logger.debug("Debug");
        logger.info("Info");

        System.out.println("end it");
    }

}