Как читать из многопоточного буфера log4j2 - PullRequest
0 голосов
/ 07 сентября 2018

Я выполнил автоматические тестовые случаи с многопоточностью под управлением maven-surefire-plugin.Каждый класс имеет свой собственный поток, в котором он выполняется, и log4j2 настроен с bufferIO = true и immediateFlush= true.В выходном файле все потоки смешивают информацию.Я знаю, что log4j2 имеет этот буфер, и я хотел бы знать, есть ли у каждого потока свой собственный буфер и могу ли я читать его до того, как информация будет записана в выходной файл.

Iпрочитайте другой вопрос, связанный с этой темой, но он не нашел решения.И по этой причине я пытаюсь найти другой путь, по которому нужно идти.

1 Ответ

0 голосов
/ 11 сентября 2018

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

С другой стороны, выходной файл из log4j, когда пользователь выполняет его с многопоточностью, всегда показывает смешивание всех потоков независимо от версии JUnit.

Им я добавляю идентификатор потока в шаблон макета log4j: %d{yyyy-MM-dd HH:mm:ss} %-5p- **[%tid]** %m%n

И после завершения каждого потока я читаю последние строки выходного файла log4j и фильтрую по номеру идентификатора потока, чтобы получить соответствующие строки. С этим пунктом мне пришлось решить другую проблему. Как получить абсолютный путь к выходному лог-файлу динамического log4j? Я тестирую два решения:

  1. Отражением (не рекомендуется, но быстрее)
  2. Реализуйте свой собственный FileAppender, чтобы создать метод для доступа к полю fileName

Следующие два шага следуют первому варианту:

LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Appender appender = ctx.getConfiguration().getAppenders().get("file");

Переменная appender имеет поле fileName, но оно является закрытым.

...