Перекрывающиеся линии печати в многопроцессорной - PullRequest
0 голосов
/ 05 сентября 2018

Недавно я столкнулся с многопроцессорностью, и у меня есть около 10 процессов, которые печатают одновременно в разных файлах, но на одной консоли (консоль Eclipse). Количество отпечатков составляет от 40 до 50 строк в секунду для каждого процесса. Я использую объект Logger, который создается отдельно для каждого процесса, и метод печати, который добавляет отметку времени, уровень и тег имени процесса к сообщению для печати и печатает сообщение. Случается так, что некоторые строки печатаются правильно, а другие печатаются на одной строке, очевидно, потому что они печатаются в одно и то же время.

Вывод, который я получаю:

2018/09/05 10:43:20.362 | INFO    | P1 | ------------------------------------------------------------------------
2018/09/05 10:43:20.362 | INFO    | P1 | Processing line 208 
2018/09/05 10:43:20.362 | INFO    | P1 | ------------------------------------------------------------------------
2018/09/05 10:43:20.378 | INFO    | P1 | Processing line 209 
2018/09/05 10:43:20.378 | INFO    | P1 | ------------------------------------------------------------------------
2018/09/05 10:43:20.378 | INFO    | P1 | ------------------------------------------------------------------------2018/09/05 10:43:20.378 | P2 | Processing line 107 

2018/09/05 10:43:20.378 | INFO    | P2 | ------------------------------------------------------------------------
2018/09/05 10:43:20.384 | INFO    | P2 | Processing line 108 
2018/09/05 10:43:20.384 | INFO    | P2 | ------------------------------------------------------------------------2018/09/05 10:43:20.384 | P1 | ------------------------------------------------------------------------

2018/09/05 10:43:20.384 | INFO    | P1 | Processing line 210 
2018/09/05 10:43:20.384 | INFO    | P1 | ------------------------------------------------------------------------

Вместо этого я бы хотел:

2018/09/05 10:43:20.362 | INFO    | P1 | ------------------------------------------------------------------------
2018/09/05 10:43:20.362 | INFO    | P1 | Processing line 208 
2018/09/05 10:43:20.362 | INFO    | P1 | ------------------------------------------------------------------------
2018/09/05 10:43:20.378 | INFO    | P1 | Processing line 209 
2018/09/05 10:43:20.378 | INFO    | P1 | ------------------------------------------------------------------------
2018/09/05 10:43:20.378 | INFO    | P1 | ------------------------------------------------------------------------
2018/09/05 10:43:20.378 | INFO    | P2 | Processing line 107 
2018/09/05 10:43:20.378 | INFO    | P2 | ------------------------------------------------------------------------
2018/09/05 10:43:20.384 | INFO    | P2 | Processing line 108 
2018/09/05 10:43:20.384 | INFO    | P2 | ------------------------------------------------------------------------
2018/09/05 10:43:20.384 | INFO    | P1 | ------------------------------------------------------------------------
2018/09/05 10:43:20.384 | INFO    | P1 | Processing line 210 
2018/09/05 10:43:20.384 | INFO    | P1 | ------------------------------------------------------------------------

В приведенном выше примере я показал только строки INFO, но если что-то случится во время обработки строки, у меня будет следующий отпечаток, который будет ОШИБКОЙ, описывающей, что произошло. Я пытался печатать только строки ОШИБКИ и работает просто отлично, так как не так много для печати. Но иногда просто ошибки не достаточно. Есть другие строки, которые говорят мне намного больше, чем «Обработка строки», и я не могу пропустить их из консоли, мне нужно открыть файл, чтобы увидеть их.

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

Есть предложения?

...