Я пытаюсь реализовать и настроить собственный фильтр в Log4J2 - на основе ThresholdFilter, но намеревался сделать больше. Я видел темы в пользовательских приложениях, которые следуют одному и тому же синтаксису аннотации плагинов, но не нашли темы для пользовательских фидеров.Пользовательский фильтр Log4j2
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, я думал, что это будет работать.
что я делаю неправильно?
Чтобы закрыть петлю для будущих читателей. Кажется, добавление атрибута пакетов помогло программе PluginManager найти мой фильтр. – WiSparky82