Log4j: один файл журнала на запрос - PullRequest
3 голосов
/ 25 февраля 2010

У нас есть пакетное приложение weblogic, которое обрабатывает несколько запросов от потребителей одновременно. Мы используем log4j для регистрации целей. Прямо сейчас мы входим в один файл журнала для нескольких запросов. Отладка проблемы для данного запроса становится утомительной, так как для всех запросов журналы находятся в одном файле.

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

Мы не можем запускать и останавливать производственный сервер каждый раз, поэтому исключается необходимость использования переопределенного файлового приложения с отметкой времени или идентификатором запроса. Это то, что объясняется в статье ниже: http://veerasundar.com/blog/2009/08/how-to-create-a-new-log-file-for-each-time-the-application-runs/

Я также пытался поиграть с этими альтернативами:

http://cognitivecache.blogspot.com/2008/08/log4j-writing-to-dynamic-log-file-for.html

http://www.mail-archive.com/log4j-user@logging.apache.org/msg05099.html

Этот подход дает желаемые результаты, но он не работает должным образом, если несколько запросов отправляются одновременно. Из-за некоторых проблем параллелизма журналы идут тут и там.

Я ожидаю помощи от вас, ребята. Заранее спасибо ....

Ответы [ 3 ]

4 голосов
/ 05 марта 2010

Посмотрите на SiftingAppender поставка с logback (преемником log4j), она разработана для создания дополнений по критериям времени выполнения.

Если вашему приложению необходимо создать только один файл журнала за сеанс, просто создайте дискриминатор на основе идентификатора сеанса. Написание дискриминатора включает 3 или 4 строки кода и, следовательно, должно быть довольно простым. Если вам нужна помощь, прокричите в списке рассылки logback-пользователя.

4 голосов
/ 25 февраля 2010

Вот мой вопрос на ту же тему: динамически создаваемые и уничтожаемые приложения для ведения журналов

Я продолжаю это в теме, где обсуждаю, как сделать нечто подобное, в списке рассылки Log4J: http://www.qos.ch/pipermail/logback-user/2009-August/001220.html

Сеси Гульку (изобретатель log4j) не думала, что это хорошая идея ... предложила вместо этого использовать Logback.

Мы все равно сделали это, используя специальный файловый аппендер. См. Мои обсуждения выше для более подробной информации.

2 голосов
/ 23 февраля 2018

Эта проблема очень хорошо решается Logback . Я предлагаю выбрать его, если у вас есть свобода.

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

Чтобы разделить ваши файлы на requestId, вы можете сделать что-то вроде этого:

logback.xml

<configuration>

  <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator>
      <key>requestId</key>
      <defaultValue>unknown</defaultValue>
    </discriminator>
    <sift>
      <appender name="FILE-${requestId}" class="ch.qos.logback.core.FileAppender">
        <file>${requestId}.log</file>
        <append>false</append>
        <layout class="ch.qos.logback.classic.PatternLayout">
          <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
        </layout>
      </appender>
    </sift>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="SIFT" />
  </root>

</configuration>

Как видите (внутри элемента discriminator), вы собираетесь различать файлы, используемые для записи журналов в requestId. Это означает, что каждый запрос будет идти к файлу, который соответствует requestId. Следовательно, если у вас есть два запроса, где requestId=1, и один запрос, где requestId=2, у вас будет 2 файла журнала: 1.log (2 записи) и 2.log (1 запись).

В этот момент вы можете задаться вопросом, как установить key. Это делается путем помещения пар ключ-значение в MDC (обратите внимание, что ключ соответствует ключу, определенному в файле logback.xml):

RequestProcessor.java

public class RequestProcessor {

    private static final Logger log = LoggerFactory.getLogger(RequestProcessor.java);

    public void process(Request request) {
        MDC.put("requestId", request.getId());
        log.debug("Request received: {}", request);
    }
}

И это в основном все для простого варианта использования. Теперь каждый раз, когда поступает запрос с другим (еще не встреченным) идентификатором, для него создается новый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...