Создание нескольких файлов журналов различного содержания с помощью log4j

Есть ли способ настроить log4j так, чтобы он выводил разные уровни ведения журнала в разные приложения?

Я пытаюсь настроить несколько файлов журнала. Основной файл журнала будет захватывать все сообщения INFO и выше для всех классов. (В разработке он будет захватывать все сообщения DEBUG и выше, а TRACE - для определенных классов.)

Затем я хотел бы иметь отдельный файл журнала. Этот файл журнала будет захватывать все сообщения DEBUG для определенного поднабора классов и игнорировать все сообщения для любого другого класса.

Есть ли способ получить то, что мне нужно?

Спасибо, Dan

Ответ 1

Это должно помочь вам:

log4j.rootLogger=QuietAppender, LoudAppender, TRACE
# setup A1
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender
log4j.appender.QuietAppender.Threshold=INFO
log4j.appender.QuietAppender.File=quiet.log
...


# setup A2
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.LoudAppender.Threshold=DEBUG
log4j.appender.LoudAppender.File=loud.log
...

log4j.logger.com.yourpackage.yourclazz=TRACE

Ответ 2

Возможно, что-то вроде этого?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 <!-- general application log -->
 <appender name="MainLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="server.log" />
  <param name="Threshold" value="INFO" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender> 
 <!-- additional fooSystem logging -->
 <appender name="FooLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="foo.log" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender>
 <!-- foo logging -->
 <logger name="com.example.foo">
  <level value="DEBUG"/>
  <appender-ref ref="FooLogFile"/>
 </logger>
 <!-- default logging -->
 <root>
  <level value="INFO"/>
  <appender-ref ref="MainLogFile"/>
 </root>
</log4j:configuration>

Таким образом, все информационные сообщения записываются на сервер .log; напротив, foo.log содержит только сообщения com.example.foo, в том числе сообщения уровня отладки.

Ответ 3

У меня был этот вопрос, но с завихрением - я пытался записать другой контент в разные файлы. У меня была информация для журнала отладки LowLevel и журнала пользователей HighLevel. Я хотел, чтобы LowLevel перешел только к одному файлу, а HighLevel - как к файлу, так и к syslogd.

Мое решение состояло в том, чтобы настроить 3 appenders, а затем настроить регистрацию следующим образом:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

log4j.logger.HighLevel=ALL,Syslog,HighLogger
log4j.additivity.HighLevel=false

Часть, которую мне трудно было понять, заключалась в том, что в log4j.logger можно было указать несколько добавлений. Я пытался сделать это по одной строке за раз.

Надеюсь, это поможет кому-то в какой-то момент!

Ответ 4

Для основного файла журнала /appender настройте .Threshold = INFO, чтобы ограничить то, что действительно зарегистрировано в приложении, до INFO и выше, независимо от того, включены ли логины DEBUG, TRACE и т.д.

Что касается ловушки DEBUG и ничего выше этого... вам, вероятно, придется писать пользовательский appender.

Однако я бы порекомендовал не делать этого, так как кажется, что это затруднит устранение неполадок и анализ:

  • Если ваша цель состоит в том, чтобы иметь один файл, в котором вы можете найти что-то, чтобы устранить что-то, то распространение данных журнала в разных файлах будет раздражать - если у вас нет очень регламентированной политики ведения журнала, вам, скорее всего, понадобится контент из обоих DEBUG и INFO, чтобы иметь возможность эффективно отслеживать выполнение проблемного кода.
  • Если вы все еще регистрируете все свои отладочные сообщения, вы теряете прирост производительности, который обычно получаете в производственной системе, поворачивая журнал (путь) вниз.

Ответ 5

Демонстрационная ссылка: https://github.com/RazvanSebastian/spring_multiple_log_files_demo.git

Мое решение основано на конфигурации XML с использованием spring-boot-starter-log4j. Этот пример является базовым примером использования spring-boot-starter и два регистратора записывают в разные файлы журнала.