Log4j2自定义过滤器

我试图在Log4J2中实现和配置自定义过滤器-

基于ThresholdFilter,但打算做更多。我已经看到了有关自定义追加程序的主题,这些主题遵循相同的插件注释语法,但是还没有找到有关自定义拟合程序的主题。

(基于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);

}

}

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

}

}

配置语法似乎与Apache文档中的语法匹配,并且模仿ThresholdFilter(有效的提供的过滤器)。如果将其放置为如图所示,作为上下文级别的筛选器,我看不到任何错误,但是没有调用或应用该筛选器。

如果我将自定义过滤器标签移动到Appender内(这对于开箱即用的过滤器是可能的,我会得到2015-03-24 16:20:11,713 ERROR

AppenderRef contains an invalid element or attribute "MyCustomFilter"

基于Apache Log4J2文档和log42j核心源代码中的示例,我认为这可以工作。

我究竟做错了什么?

回答:

您能显示配置的第一行<Configuration>元素吗?

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

也许log4j找不到您的插件。

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

<Configuration status="trace" packages="com.me.mycustomfilterpackage"> ...

有关更多详细信息,请参见本手册页,了解PluginManager如何尝试查找插件。

以上是 Log4j2自定义过滤器 的全部内容, 来源链接: utcz.com/qa/428725.html

回到顶部