gpt4 book ai didi

java - Log4j2 自定义过滤器

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:20:58 25 4
gpt4 key购买 nike

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

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 “我的自定义过滤器”

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

我做错了什么?

最佳答案

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

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

也许 log4j 找不到您的插件。

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

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

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

关于java - Log4j2 自定义过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29243229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com