2016-09-25 1 views
1

Мой простой вопрос: если у меня есть два оператора типа logger.info() и logger.error() в Java (с использованием log4j), я хочу, чтобы результаты этих двух строк печататься в двух отдельных файлах. То есть logger.info (...) должен печатать в файл, скажем, myLog.info и logger.error (...) должны печатать в файле myLog.error. Я использую скопированный файл appender для этой задачи. Также я хочу, чтобы только один объект-регистратор выполнял задачу. Кто-то может предложить два или более разных регистратора по одному для каждого файла, но это не так.Регистрация различных уровней с использованием одного и того же объекта для разных файлов

Я попытался найти решение проблемы. Одна из ссылок Creating multiple log files of different content with log4j говорит о «пороге», и я даже попытался добавить порог в свой файл конфигурации xml. Но что это на самом деле делает: info log печатается в файле myLog.info, но журнал ошибок печатается в обоих файлах. Может ли это быть сделано через файл конфигурации xml самостоятельно или требуется отдельный файл свойств? Если xml-файл достаточно, то что нужно сделать?

Я предпочитаю файл xml file over properties. Если есть рабочее решение, использующее только файл конфигурации xml, этого было бы достаточно. Заранее спасибо.

+0

Посмотрите, поможет ли это. Http://stackoverflow.com/questions/9652032/how-can-i-create-2-separate-log-files-with-one-log4j-config-file – mhasan

+0

@mhasan На самом деле Я ищу ответ, содержащий файл конфигурации xml ... но я тоже попробую. Спасибо –

+0

@mhasan Еще одна вещь, просто глядя на ответ, я понял, что на самом деле он делает два разных регистратора ... Я хочу, чтобы только один регистратор выводил журналы различного уровня в разные файлы. –

ответ

1

Вы можете использовать фильтры, чтобы отклонять любые сообщения, кроме тех, которые вы хотите. Вот пример того, как сделать это:

Первый класс, чтобы проверить наши усилия:

package test; 
import org.apache.log4j.Logger; 

public class Main { 

    private static final Logger logger = Logger.getLogger(Main.class); 
    public static void main(String[] args) { 
     logger.debug("here's some debug"); 
     logger.info("here's some info"); 
     logger.warn("here's some warn"); 
     logger.error("here's some error"); 
     logger.fatal("here's some fatal"); 
    } 

} 

Вперед log4j.xml конфигурационный файл для настройки appenders и регистраторы:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> 
    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender"> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" /> 
     </layout> 
    </appender> 

    <appender name="debugLog" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="logs/debug.log" /> 
     <param name="Append" value="true" /> 
     <param name="MaxFileSize" value="5000KB" /> 
     <param name="maxBackupIndex" value="5" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %m%n" /> 
     </layout> 

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

     <filter class="org.apache.log4j.varia.DenyAllFilter" /> 
    </appender> 

    <appender name="infoLog" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="logs/info.log" /> 
     <param name="Append" value="true" /> 
     <param name="MaxFileSize" value="5000KB" /> 
     <param name="maxBackupIndex" value="5" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p - %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.DenyAllFilter" /> 
    </appender> 

    <logger name="test" additivity="false"> 
     <level value="DEBUG" /> 
     <appender-ref ref="consoleAppender" /> 
     <appender-ref ref="debugLog" /> 
     <appender-ref ref="infoLog" /> 
    </logger> 
</log4j:configuration> 

Этот шаблон позволит вам создать отдельный журнал для каждого уровня журнала, просто повторите конфигурацию, которую я предоставил для отладки или ведения журнала. Обратите внимание, что консольный appender будет принимать все уровни.

Мне удалось получить некоторое представление от this post, поэтому я подумал, что должен отдать должное.

+0

Я искал решения, но никто не упомянул способ использования фильтра соответствия уровня. Это работало очень хорошо. Благодарю. :) –