问题描述
您能显示配置的第一行<Configuration>
元素吗?
您可以指定<Configuration status="trace">
使log4j的内部日志记录出现在控制台上,这可能有助于解决问题。
也许log4j找不到您的插件。
编译插件时,将创建序列化的插件列表文件。该文件包含您的插件的名称和二进制格式的类名。如果此文件包含在包含您的插件类的jar中,则log4j可以找到您的插件。帮助log4j查找插件的另一种方法是为packages
配置文件指定属性:
<Configuration status="trace" packages="com.me.mycustomfilterpackage"> ...
有关更多详细信息,请参见本手册页,了解PluginManager如何尝试查找插件。
解决方法
我试图在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 Object msg,final Throwable t) {
return filter(level);
}
@Override
public Result filter(final Logger logger,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文档和log42j核心源代码中的示例,我认为这可以工作。
我究竟做错了什么?