Регистрация параллельных потоков в logback - PullRequest
9 голосов
/ 09 августа 2011

Я постараюсь составить краткое описание моей платформы Selenium, чтобы объяснить свою проблему.

Я использую Selenium 2 (текущая версия 2.3.1) + testNG 5.14

Я установил файл testng.xml для параллельного запуска тестов в наборе тестов, всего 2 экземпляра

В целях ведения журнала я использую logback (Я читал, это следующая лучшая вещь в мире журналов)

Моя проблема в том, что при проверке журналов приложений я получаю что-то вроде этого:

18: 48: 58.551 [TestNG] INFO daastsetup.TestConfiguration - получение случайного пользователя из пула пользователей

18: 48: 58.551 [TestNG] INFO daastsetup.TestConfiguration - получение случайного пользователя из пула пользователей

18: 48: 58.551 [TestNG] DEBUG daastsetup.TestConfiguration - создание источника данных для доступа к базе данных

18: 48: 58.551 [TestNG] DEBUG daastsetup.TestConfiguration - создание источника данных для доступа к базе данных

18: 48: 58.552[TestNG] DEBUG daastsetup.TestConfiguration - запуск SQL-запроса

18: 48: 58.552 [TestNG] DEBUG daastsetup.TestConfiguration - запуск SQL-запроса

18: 48: 59.613 [TestNG] TRACE daastsetup.TestConfiguration - успешный запрос

18: 48: 59.613 [TestNG] TRACE daastsetup.TestConfiguration - Успешный запрос

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

PD На всякий случай это может помочь, мой выход из системы.xml файл выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logs/selenium.log</file>

    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="trace">
    <appender-ref ref="FILE" />
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

Ответы [ 3 ]

10 голосов
/ 10 августа 2011

Logback Сопоставленный диагностический контекст (MDC) - ваш друг. Он позволяет добавлять локальные переменные потока, которыми можно управлять, копировать между потоками и регистрировать в формате журналирования.

Из документов:

Одной из целей разработки logback является аудит и отладка сложных распределенных приложений. Большинство реальных распределенных систем должны иметь дело с несколькими клиентами одновременно. В типичной многопоточной реализации такой системы разные потоки будут обрабатывать разных клиентов. Возможный, но немного обескураженный подход, позволяющий отличить результаты регистрации одного клиента от другого, заключается в создании нового отдельного регистратора для каждого клиента. Этот метод способствует распространению регистраторов и может увеличить их служебные расходы.

Более легкая техника состоит в том, чтобы однозначно штамповать каждый запрос журнала, обслуживающий данного клиента. Нил Харрисон описал этот метод в книге «Шаблоны для регистрации диагностических сообщений на шаблонных языках разработки программ 3» под редакцией Р. Мартина, Д. Риля и Ф. Бушмана (Addison-Wesley, 1997). Logback использует вариант этого метода, включенного в API SLF4J: сопоставленные диагностические контексты (MDC).

Чтобы однозначно пометить каждый запрос, пользователь помещает контекстную информацию в MDC, сокращение от Mapped Diagnostic Context. Существенные части класса MDC показаны ниже. Пожалуйста, обратитесь к MDC javadocs для полного списка методов.

7 голосов
/ 25 октября 2012

К вашему сведению, вы можете вывести идентификатор потока, используя% thread, как описано в документации по адресу http://logback.qos.ch/manual/configuration.html:

The output is formatted using a PatternLayoutEncoder set to the pattern %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n.
6 голосов
/ 01 октября 2013

Если вам нужна альтернатива непредсказуемым именам, которые вы получаете с% thread, как я обычно делаю, вы можете использовать простые локальные идентификаторы потока.Это намного проще для глаз.Это будет работать с logback ...

public class ThreadIdConverter extends ClassicConverter {
  private static int nextId = 0;
  private static final ThreadLocal<String> threadId = new ThreadLocal<String>() {    
    @Override
    protected String initialValue() {
      int nextId = nextId();
      return String.format("%05d", nextId);
    }
  };

  private static synchronized int nextId() {
    return ++nextId;
  }

  @Override
  public String convert(ILoggingEvent event) {
    return threadId.get();
  }
}

Затем поместите эту простую строку в свой XML logback:

<conversionRule conversionWord="tid" 
    converterClass="com.yourstuff.logback.ThreadIdConverter" />

Установите ваш шаблон примерно так (обратите внимание на "tid"):1007 *

<pattern>%d{HH:mm:ss.SSS} [%tid] %-5level - %msg%n</pattern>

И ваши журналы будут выглядеть так:

10:32:02.517 [00001] INFO something here
10:32:02.517 [00002] INFO something here
10:32:02.517 [00003] INFO something here
10:32:02.517 [00001] INFO something more here 
10:32:02.517 [00001] INFO something more here

Вы можете сделать это с любым регистратором, который поддерживает пользовательские расширения.Надеюсь, это поможет.

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