2013-10-11 3 views
0

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

Мне кажется довольно ясным, что асинхронные регистраторы - это явный победитель с точки зрения лучшей производительности, и это имеет смысл. Я не понимаю компромиссы файлов Random Access File Appenders и Buffered File Appenders. Я посмотрел на сайт log4j here, но я не видел никакого реального недостатка в использовании Random Access File Appenders.

Может ли кто-нибудь объяснить различия и объяснить, когда каждый из них должен использоваться?

+0

Async Loggers - это функция log4j2. Вы должны лучше пометить log4j2 для этого вопроса. –

+0

Спасибо, @anuu_online, я изменил теги. – HardcoreBro

ответ

2

Достопримечательности:

  • RandomAccessFileAppenders всегда буферизацией. Начиная с бета-9 размер буфера составляет 256 * 1024 байта и не настраивается. Это станет настраиваться в следующей версии.
  • FileAppenders может быть сконфигурирован с атрибутом bufferedIO для буферизации или нет. Начиная с бета-9 размер буфера составляет 8 * 1024 байта и не настраивается. Это станет настраиваться в следующей версии.

  • Под капотом FileAppenders использует java.io.FileOutputStream, который может быть обернут в BufferedOutputStream. RandomAccessFileAppenders записывают в ByteBuffer, который добавляется к концу RandomAccessFile, когда буфер заполнен или вызывается flush(). Не должно быть большой разницы (кроме производительности), но FileAppenders имеют более длинный послужной список, и все еще могут возникать проблемы с новыми RandomAccessFileAppenders, которые еще не были обнаружены. Roll-over, похоже, отлично работает для обоих типов приложений, но могут быть случаи, которые команда еще не знает. (Log4J2 находится в активной разработке, хотя и любые проблемы будут решаться быстро.)

  • И RandomAccessFileAppenders и FileAppenders могут быть настроены с атрибутом immediateFlush, чтобы очистить каждое событие журнала на диске. Я рекомендую вам отключить immediateFlush при использовании AsyncAppenders или AsyncLoggers, чтобы вы могли использовать хорошее поведение в пакетном режиме, которое они предоставляют: асинхронные приложения и регистраторы могут сбрасываться после регистрации нескольких событий и также обязательно будут кратковременно сбросить один раз, когда очередь будет пустой, что очень эффективно и в то же время гарантирует, что все события журнала всегда сохраняются на диске.

0

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

EDIT Можно было бы ожидать, что класс под названием RandomAccessAppender будет использовать произвольный доступ, что означает отсутствие буферизации, но, по-видимому, это не так!

+0

EJP, вы правы, конечно. Это просто, что имя RandomAccessFileAppender уже очень длинное, я действительно не хотел называть его BufferedRandomAccessFileAppender (имейте в виду, есть еще одна версия, которая поддерживает roll-over. Представьте себе: RollingBufferedRandomAccessFileAppender ... :-)) Надеемся, что документы на сайте помогите решить любую путаницу ... –

+1

Вы, кстати, являетесь автором Фундаментальной сети в Java? Отличная книга! –