О входе в систему AsyncAppender

Когда я проверял документ AsyncAppender в logback, я не нашел ничего похожего на настройку пула потоков, которая поддерживает AsyncAppender.

Означает ли это, что есть только 1 поток, чтобы использовать события журнала из очереди блокировки? (хотя события журнала могут создаваться несколькими потоками, скажем, 20-40)

Спасибо

Леон

2 ответа

Решение

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

AsyncAppender буферизует события в BlockingQueue. Рабочий поток, созданный AsyncAppender, получает события из заголовка очереди и отправляет их одному приложению, подключенному к AsyncAppender.

И глядя на код; AsyncAppenderBase запускает один экземпляр Thread принимать события от аппендера blockingQueue,

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

Если вы обеспокоены тем, что этот рабочий поток не сможет обрабатывать эти события так быстро, как они создаются, вы можете настроить следующие свойства:

  • queueSize: Максимальная емкость очереди блокировки. По умолчанию для queueSize установлено значение 256.
  • discardingThreshold: По умолчанию, когда в очереди на блокировку остается 20% оставшейся емкости, она будет сбрасывать события уровня TRACE, DEBUG и INFO, сохраняя только события уровня WARN и ERROR. Чтобы сохранить все события, установите DiscardingThreshold в 0.

Вы можете увеличить queueSize чтобы гарантировать, что вы не потеряете ни одного события (хотя и за счет использования ресурсов, поскольку сохраненные события будут находиться в куче вашего приложения до тех пор, пока они не будут отправлены соответствующему приложению). Или вы можете улучшить производительность - за счет потери событий с более низким приоритетом - установив discardingThreshold,

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

Возможно, вы ожидаете, что форматирование строк и методы toString будут вызваны вне потока... Я ожидаю, что они не будут, поскольку аргументы сообщения журнала, вероятно, будут изменены вскоре после вызова. Синхронность в основном предотвращает блокировку ввода-вывода, например задержку диска, от воздействия на критичный для производительности код.

Другие вопросы по тегам