Изменение уровня приоритета в Log4j

Привет, как правило, в уровнях приоритета Log4j:

  • DEBUG < INFO < WARN < ERROR < FATAL

Можем ли мы изменить эти уровни приоритета. Мое требование - мне нужно регистрировать только те данные, которые имеют приоритет INFO и FATAL. Журналы с уровнем приоритета DEBUG, WARN и ERROR не должны регистрироваться. Если я могу изменить уровни приоритета как

  • DEBUG < WARN < ERROR < INFO < FATAL

можно. Или есть другой способ сделать это. Помощь Pls.

Ответ 1

Мне никогда не нужно было это делать, но поскольку я однажды прочитал Log4J - The Complete Manual, я надеюсь, что эти указатели помогут.

  • Напишите свой собственный фильтр, расширив org.apache.log4j.spi.Filter
  • Переопределить решить метод
  • Используйте loggingEvent.getLevel(), чтобы определить уровень запуска журнала.
  • Напишите следующую логику в решении

    if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL)
      return ACCEPT;
    return DENY;
    

Этот фильтр будет принимать все журналы, которые являются либо INFO, либо FATAL. Вы можете стать более креативными.

Обратите внимание, что я не тестировал этот код. Это всего лишь ориентир, надеюсь, что это поможет


Изменить: при поиске бит я нашел что-то, что может быть проще. Я думаю, вы можете использовать LevelMatchFilter, таким образом

    <filter class="org.apache.log4j.varia.LevelMatchFilter">
    <param name="LevelToMatch" value="info" />
    <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
    <param name="LevelToMatch" value="fatal" />
    <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>

обратитесь к http://wiki.apache.org/logging-log4j/Log4jXmlFormat для конфигурации XML. Существует раздел на Filter Configuration


Я не знаю, что останавливает OP при принятии этого ответа. Я только что протестировал, он работает:

Вот XML.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="util" class="org.apache.log4j.FileAppender">
    <param name="File" value="D:/util.log" />
    <param name="Append" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/>
    </layout>           

    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="info" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="fatal" />
        <param name="AcceptOnMatch" value="true" />
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>

  </appender> 

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="util" /> 
  </root>


</log4j:configuration>

Вот код Java

    DOMConfigurator.configure("log4j.xml");
    Logger log = Logger.getLogger(Test.class);
    log.debug("DEBUG");
    log.info("INFO");
    log.warn("WARN");
    log.error("ERROR");
    log.fatal("FATAL");

Вот результат в (как настроено) D:/util.log

main INFO  test.Test - INFO
main FATAL test.Test - FATAL

Ответ 2

Afaik, вы не можете изменить приоритет приоритета в Log4j. Но вы можете написать собственную реализацию регистратора, которая будет регистрировать только необходимую информацию:

  • напишите собственную пару LoggerFactory/Logger
  • укажите LoggerFactory в файле log4j.properties:

    log4j.loggerFactory = com.mycompany.mypackage.MyLog4JLoggerFactory

  • в вашей реализации Logger, игнорировать все, кроме ошибок INFO и FATAL.

Однако выше может быть не лучшее решение, потому что оно ориентировано на 1.2.x. Возможно, более новые версии log4j (SLF4J) имеют более элегантные способы его достижения.

Ответ 4

Вы можете добиться этого, внеся некоторые изменения в файл log4j.properties.
Например, ваш уровень по умолчанию может быть FATAL, а затем вы можете указать свой пакет или класс для уровня INFO.

log4j.rootLogger = FATAL, stdout, R

Заявление для журналов пакетов:
log4j.logger.com.xxx = ИНФОРМАЦИЯ

Заявление для журналов классов:
log4j.logger.com.xxx.util.EmailManager = ИНФОРМАЦИЯ

Надеюсь, что это поможет.