log4j - ОШИБКА, лог DEBUG?

1

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

У меня есть рабочая конфигурация log4j, которую я добавлю в конец моего вопроса. Приложение запускается каждые x минут с помощью cronjob.

Поведение log4j, которое я бы хотел увидеть, следующее:

  1. Все записи INFO (и выше) выполняются для файла A
  2. Все записи ERROR (и выше) выполняются для файла B
  3. В случае ОШИБКИ (или вверх) отправляется почта, содержащая строки DEBUG (и вверх) данного исполнения.

Я достиг 1 и 2, используя приведенную ниже конфигурацию. Возможно ли также номер 3 с использованием log4j (если нет, почему бы и нет?), И если да, то как?

Текущая конфигурация:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <RandomAccessFile name="LogFile" fileName="/var/log/fileA.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </RandomAccessFile>
    <RandomAccessFile name="ErrorLogFile" fileName="/var/log/fileB.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </RandomAccessFile>
    <SMTP name="MailError" subject="Error occurred" to="[email protected]" smtpHost="mail.foo.bar" from="[email protected]"/>
    <Async name="Async">
      <AppenderRef ref="LogFile"/>
    </Async>
    <Async name="Errors">
      <AppenderRef ref="ErrorLogFile"/>
      <AppenderRef ref="MailError"/>
    </Async>
  </Appenders>
  <Loggers>
    <Root level="DEBUG">
      <AppenderRef ref="Console" level="INFO"/>
      <AppenderRef ref="Async" level="INFO"/>
      <AppenderRef ref="Errors" level="ERROR"/>
    </Root>
  </Loggers>
</Configuration>
  • 0
    Номер 3 должен быть возможен путем буферизации лог-операторов, как предлагается здесь для logback (нечто подобное должно быть доступно в log4j).
  • 0
    @vanOekel Хорошо, но тогда мне придется написать свой собственный аппендир?
Показать ещё 2 комментария
Теги:
logging
log4j
log4j2

1 ответ

0
Лучший ответ

Я думаю, вы сможете достичь этого с помощью ThresholdFilter. Создайте уровень корневого регистратора TRACE, чтобы он отправлял все события всем приложению, а затем добавлял разные пороговые фильтры для каждого приложения. В руководстве по log4j2 приведен пример.


(EDIT) Понимая требования лучше, я думаю, что SMTP Appender уже делает то, что вам нужно: он внутренне хранит буфер событий (по умолчанию 512), который предшествовал событию ERROR, вызвавшему электронное письмо. Эти предшествующие события будут включены в электронное письмо.

  • 0
    Хммм, помогите мне здесь, если хотите ... Я могу представить, что ThresholdFilter для DEBUG / INFO / WARN будет НЕЙТРАЛЬНЫМ, а ThresholdFilter для ERROR и до ПРИНЯТЬ. Но если я правильно прочитал документацию log4j , для меня это не сработает: если возвращается значение NEUTRAL, то используется следующий фильтр в цепочке. Если в цепочке больше нет фильтров, то регистрируется событие журнала. Таким образом, при отсутствии фильтров поведение по умолчанию - регистрировать все события регистрации. Это все еще приводит к регистрации, если нет ОШИБКИ.
  • 0
    Что насчет Дени?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню