2015-03-24 4 views
0

Я пытаюсь реализовать и настроить собственный фильтр в 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, я думал, что это будет работать.

что я делаю неправильно?

ответ

0

можете ли вы показать первую линию вашей конфигурации, тем <Configuration> элемент?

вы можете указать <Configuration status="trace">, чтобы сделать внутреннее ведение журнала log4j на консоли, что может помочь устранить проблему.

Возможно, у log4j есть проблемы с поиском вашего плагина.

При компиляции вашего плагина создается файл для записи в виде сериализованного плагина. Этот файл содержит имя вашего плагина и имя класса в двоичном формате. Если этот файл включен в банку, содержащую ваш класс плагина, log4j может найти ваш плагин. Еще один способ помочь log4j найти плагин, чтобы указать атрибут packages ваш конфигурационный файл:

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

Более подробно см this manual page о том, как PluginManager пытается найти плагин.

+0

Чтобы закрыть петлю для будущих читателей. Кажется, добавление атрибута пакетов помогло программе PluginManager найти мой фильтр. – WiSparky82

Смежные вопросы