【问题标题】:Log4j2 custom filterLog4j2 自定义过滤器
【发布时间】:2015-05-28 09:21:16
【问题描述】:

我正在尝试在 Log4J2 中实现和配置自定义过滤器 - 基于 ThresholdFilter,但打算做更多。我看过关于自定义 appender 的主题,它们遵循相同的插件注释语法,但没有找到关于自定义 fitler 的主题。

MyCustomFilter.java(基于 ThresholdFilter)

@Plugin(name = "MyCustomFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
public class MyCustomFilter extends AbstractFilter {

    private static final long serialVersionUID = 1L;

    private final Level level;

    private MyCustomFilter(final Level level, final Result onMatch, final Result onMismatch) {
        super(onMatch, onMismatch);
        this.level = level;
    }

    @Override
    public Result filter(final Logger logger, final Level level, final Marker marker, final String msg, final Object... params) {
        return filter(level);
    }

    @Override
    public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg, final Throwable t) {
        return filter(level);
    }

    @Override
    public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg, final Throwable t) {
        return filter(level);
    }

    @Override
    public Result filter(final LogEvent event) {
        return filter(event.getLevel());
    }

    private Result filter(final Level level) {
        return level.isMoreSpecificThan(this.level) ? onMatch : onMismatch;
    }

    @Override
    public String toString() {
        return level.toString();
    }

    /**
     * Create a MyCustomFilter.
     * 
     * @param level
     *            The log Level.
     * @param match
     *            The action to take on a match.
     * @param mismatch
     *            The action to take on a mismatch.
     * @return The created MyCustomFilter.
     */
    @PluginFactory
    public static MyCustomFilter createFilter(@PluginAttribute("level") final Level level, @PluginAttribute("onMatch") final Result match,
            @PluginAttribute("onMismatch") final Result mismatch) {
        final Level actualLevel = level == null ? Level.ERROR : level;
        final Result onMatch = match == null ? Result.NEUTRAL : match;
        final Result onMismatch = mismatch == null ? Result.DENY : mismatch;
        return new MyCustomFilter(actualLevel, onMatch, onMismatch);
    }

}

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>

LoggingRunner.java

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");
    }

}

配置语法似乎与 Apache 文档中的相匹配,并且模仿了 ThresholdFilter(一个有效的、提供的过滤器)。如果我将其作为上下文级别过滤器放置,则不会看到任何错误,但不会调用或应用过滤器。

如果我将自定义过滤器标签移动到 Appender 内(这可以通过开箱即用的过滤器实现,我会得到 2015-03-24 16:20:11,713 ERROR AppenderRef contains an invalid element or attribute "MyCustomFilter"

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

我做错了什么?

【问题讨论】:

    标签: java apache log4j2


    【解决方案1】:

    您能否显示配置的第一行 &lt;Configuration&gt; 元素?

    您可以指定&lt;Configuration status="trace"&gt; 使log4j 的内部日志出现在控制台上,这可能有助于解决问题。

    也许 log4j 找不到你的插件。

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

    &lt;Configuration status="trace" packages="com.me.mycustomfilterpackage"&gt; ...

    有关更多详细信息,请参阅this manual page,了解 PluginManager 如何尝试定位插件。

    【讨论】:

    • 为未来的读者闭环。似乎添加 packages 属性确实有助于 PluginManager 找到我的过滤器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 2011-01-24
    • 2013-04-11
    • 2016-07-01
    • 2013-11-29
    相关资源
    最近更新 更多