войдите и третье лицо, пишущее в stdout. Как остановить их чередуемый

Сначала некоторый фон. У меня есть пакетный тип процесс Java, выполненный из сценария пакетной обработки DOS. Весь вход Java переходит к stdout, и сценарий пакетной обработки перенаправляет stdout в файл. (Это хорошо для меня, потому что я могу ОТОЗВАТЬСЯ ЭХОМ из сценария, и он входит в файл журнала, таким образом, я вижу всю командную строку JVM Java args, который является большим для отладки.) Я не могу

Я использую slf4j API, и для бэкенда я раньше использовал log4j, но недавно переключенный на logback-классика.

Хотя весь мой код приложения использует slf4j, у меня есть сторонняя библиотека, которая делает свой собственный вход (не использующий стандартный API), который также записан в stdout.

Проблема состоит в том, что иногда строки журнала перепутаны, и чисто не появляйтесь на отдельных строках. Вот пример некоторых, испортил вывод:

2010-05-28 18:00:44.783 [thread-1       ] INFO  CreditCorrelationElementBuilderImpl - Bump parameters exist for scenario, now attempting bumping. [indexDisplayName=STANDARD_S1_v300]
2010-05-28 18:01:43.517 [thread-1       ] INFO  CreditCorrelationElementBuilderImpl - Found adjusted point in data, now applying bump. [point=0.144040000000000]
2010-05-28 18:01:58.642 [thread-1       ] DEBUG com.company.request.Request         - Generated request for [dealName=XXX_20050225_01[5],dealType=GENERIC_XXX,correlationType=2,copulaType=1] in 73.8 s, Simon Stopwatch: [sys1.batchpricer.reqgen.gen INHERIT] total 1049 s, counter 24, max 74.1 s, min 212 ms
2010-05-28 18:05/28/10 18:02:20.236 INFO: [ServiceEvent] SubmittedTask:BC-STRESS_04_FZBC-2010-05-21-545024448189310126-23
01:58.658 [req-writer-2b   ] INFO  .c.g.r.o.OptionalFileDocumentOutput - Writing request XML to \\filserver\dir\file1.xml - write time: 21.4 ms - Simon Stopwatch: [sys1.batchpricer.reqgen.writeinputfile INHERIT] total 905 ms, counter 24, max 109 ms, min 10.8 ms
2010-05-28 18:02:33.626 [ResponseCallbacks-1: DriverJobSpace$TakeJobRunner$1] ERROR c.c.s.s.D.CalculatorCallback        - Id:23 no deal found !!
2010-0505/28/10 18:02:50.267 INFO: [ServiceEvent] CompletedTask:BC-STRESS_04_FZBC-2010-05-21-545024448189310126-23:Total:24

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

Проблема, кажется, это хотя PrintStream.write(byte buf[], int off, int len) синхронизируется, однако я вижу в ch.qos.logback.core.joran.spi.ConsoleTarget that System.out.write(int b) единственный названный метод записи.

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

Есть ли, кто-либо другие прикрепляют к этой проблеме чередования, чем исправление кода к ConsoleTarget так это implments другие методы записи? Любая хорошая работа arounds. Или я должен просто зарегистрировать отчет об ошибках?

Вот мой logback.xml:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-16thread] %-5level %-35.35logger{30} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

Я использую logback 0.9.20 с Java 1.6.0_07.

8
задан David Roussel 4 June 2010 в 14:07
поделиться

3 ответа

В конце концов, исправить основную проблему оказалось проще, чем любой обходной путь.

Патч для исправления: http://gist.github.com/434516

Увеличение ошибки в jira логбэка: http://jira.qos.ch/browse/LBCORE-158

2
ответ дан 6 December 2019 в 00:05
поделиться

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

2010-05-28 18:01:58.658 [req-writer-2b   ] INFO  .c.g.r.o.OptionalFileDocumentOutput - Writing request XML to \\filserver\dir\file1.xml - write time: 21.4 ms - Simon Stopwatch: [sys1.batchpricer.reqgen.writeinputfile INHERIT] total 905 ms, counter 24, max 109 ms, min 10.8 ms
05/28/10 18:02:20.236 INFO: [ServiceEvent] SubmittedTask:BC-STRESS_04_FZBC-2010-05-21-545024448189310126-23

Вторая строка, похоже, использует шаблон по умолчанию вместо вашего определения. Есть ли где-то загруженный логгер, который использует конфигурацию по умолчанию вместо вашей конфигурации XML?

.
0
ответ дан 6 December 2019 в 00:05
поделиться

В таком случае я бы пошел через System.setOut (PrintStream out) для данной сторонней библиотеки, которая не работает. Реализуйте поток, который будет читать этот поток журнала, разделив его, скажем, новой строкой, и передал его в решение для ведения журнала, которое вы используете. Только будьте осторожны, чтобы не начать читать и писать в одном и том же потоке :-) вот что вы делаете:

  • Вы получаете поток System.out, сохраните его в стороне
  • Вы настраиваете свой регистратор для использования этого потока см. OutputStreamAppender
  • Вы создаете поток, который истощает поток, который вы назначаете как new System.out (ваша сторонняя библиотека будет писать туда) и отправить хорошо отформатированный вывод в журнал

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

2
ответ дан 6 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: