Вопрос

У нас есть пакетное приложение 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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Посмотри на ПросеиваниеПриложение поставляется с функцией logback (преемник log4j), он предназначен для создания приложений по критериям времени выполнения.

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

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

Предполагая, что вы можете, вам нужно использовать Siftingappender. Анкет Это позволяет вам разделять файлы журнала в соответствии с некоторым значением времени выполнения. Это означает, что у вас есть широкий спектр параметров, как разделить файлы журнала.

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

rageback.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);
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top