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

81

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

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

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

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

Спасибо, Дэн


источник
3
Вы имеете в виду, что хотите, чтобы один файл журнала записывал DEBUG и только DEBUG, другой файл журнала - INFO и только INFO, и так далее?
Эдди

Ответы:

70

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

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
Джейсоннеротин
источник
3
Что делает самая последняя строка?
djangofan
1
@djangofan устанавливает собственный уровень журнала пакета / класса (например, com.yourpackage.yourclazz с ведением журнала TRACE), хотя в этом случае он уже был по умолчанию (установлен в строке 1), поэтому ничего не делает. ИМО, этот пример был бы лучше, если бы у rootLogger была ИНФОРМАЦИЯ, а у «вашего класса» была ОТЛАДКА.
Том Клифт
Параметры первой строки должны быть TRACE, QuietAppender, LoudAppender, а не QuietAppender, LoudAppender, TRACE
Ричард Уайтхед
26

Возможно, что-то подобное?

<!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>

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

аракнид
источник
Com.example.foo - это пакет или класс?
WowBow
1
@WowBow это может быть и то, и другое, но с таким именем он выглядит как пакет. использование имен классов для регистраторов - это просто соглашение
araqnid
Благодарю. Я попробовал оба после того, как попросил, и работает для обоих;)
WowBow
7

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

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

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

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

Мне было трудно понять, что в log4j.logger могло быть несколько добавленных файлов. Я пытался делать это по одной строчке за раз.

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

Киевели
источник
3

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

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

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

  1. Если ваша цель состоит в том, чтобы иметь один файл, в котором вы могли бы искать и устранять неполадки, то объединение данных журнала в разные файлы будет раздражать - если у вас нет строго регламентированной политики ведения журнала, вам, вероятно, понадобится контент из DEBUG и INFO для уметь эффективно отслеживать выполнение проблемного кода.
  2. Продолжая регистрировать все свои отладочные сообщения, вы теряете прирост производительности, который вы обычно получаете в производственной системе, выключая ведение журнала (способ).
Мэтт Би
источник
Я должен был лучше объяснить свою цель. Основной журнал предназначен для отслеживания ошибок, необычных условий и т. Д. В любом месте приложения - этот журнал должен быть небольшим, чтобы он регулярно обновлялся. Специальный журнал отслеживает поведение одной подсистемы и должен храниться в течение длительного времени.
Вы хотите исключить сообщения ERROR, WARN, INFO из второго файла журнала?
matt b
и в XML вы можете добавить параметр Threshold , как это: <Appender имя = "ERROR_FILE"> <парам имя = "Порог" значение = "ERROR" /> </ Appender>
Бритва
0

Демо-ссылка: https://github.com/RazvanSebastian/spring_multiple_log_files_demo.git

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

Рзв Разван
источник