Недавно я столкнулся с многопроцессорностью, и у меня есть около 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, но если что-то случится во время обработки строки, у меня будет следующий отпечаток, который будет ОШИБКОЙ, описывающей, что произошло. Я пытался печатать только строки ОШИБКИ и работает просто отлично, так как не так много для печати. Но иногда просто ошибки не достаточно. Есть другие строки, которые говорят мне намного больше, чем «Обработка строки», и я не могу пропустить их из консоли, мне нужно открыть файл, чтобы увидеть их.
Теперь мне было интересно, есть ли в любом случае доступ к данным, которые печатаются на консоли, или глобальная блокировка для печати.
Я также думал о параллельном регистраторе, который получает все стандартные выходные данные процессов и обрабатывает их перед печатью, но это означает, что я должен отслеживать, какой процесс произвел печать, и записать его в определенный файл.
Есть предложения?