Подтвердить что ты не робот

Является ли log4net намного медленнее, чем System.Diagnostics.Trace?

Я изучаю различия между использованием log4net и System.Diagnostics.Trace для ведения журнала, и мне интересно узнать о различиях в производительности, которые я наблюдал.

Я создал тестовое приложение для сравнения производительности обоих методов ведения журнала в нескольких сценариях, и я обнаружил, что log4net значительно медленнее, чем класс Trace. Например, в сценарии, в котором я регистрирую 1000 сообщений без форматирования строк, log4net означает время выполнения более 1000 проб, равное 9,00 мс. Trace выполняется со значением 1.13ms. Многие мои тестовые примеры имеют относительно большую дисперсию в времени выполнения log4net; периодический характер длительных казней с выбросами, по-видимому, предполагает вмешательство GC. Попытка с помощью CLR Profiler подтверждает наличие большого количества коллекций для тонны объектов log4net.Core.LoggingEvent, которые генерируются (справедливо, похоже, что Trace генерирует тонну объектов Char[]), но это не так, t отображает большую дисперсию, которую делает log4net.)

Одна вещь, о которой я помню, заключается в том, что, хотя log4net кажется примерно в 9 раз медленнее, чем Trace, разница составляет 8 мс на 1000 итераций; это не совсем значительная утечка производительности. Тем не менее, некоторые из моих ожидаемых вариантов использования могут вызывать методы, которые регистрируются в сотни тысяч раз, и эти цифры относятся к моей быстрой машине. На более медленной машине, более типичной для конфигураций наших пользователей, разница составляет от 170 мс до 11 мс, что является немного более тревожным.

Является ли эта производительность типичной для log4net или есть некоторые ошибки, которые могут значительно увеличить производительность log4net?

(ПРИМЕЧАНИЕ: я знаю, что форматирование строки может изменить время выполнения, я пытаюсь сравнить яблоки с яблок, и у меня есть тестовые примеры без форматирования и тестовых примеров с форматированием; log4net остается пропорционально медленным, используется ли форматирование строк или нет.)

История до сих пор:

  • Роберт Гулд имеет лучший ответ на вопрос; Мне было любопытно, было ли типично видеть, что log4net работает намного медленнее, чем класс Trace.
  • Ответ Алекс Шнайдер - интересная информация, но на самом деле не подпадает под вопрос. Половина намерений ввести этот журнал - помочь отладить как логические, так и проблемы с производительностью в живых системах; наши клиенты ставят наши продукты во многих экзотических сценариях, которые часто трудно воспроизводить без дорогостоящих и крупномасштабных конфигураций оборудования. Моя основная проблема заключается в том, что большая разница во времени между "не протоколированием" и "протоколированием" может повлиять на систему таким образом, что ошибок не происходит. В конце концов, масштаб снижения производительности велик, но величина мала, поэтому я надеюсь, что это не будет проблемой.
4b9b3361

Ответ 1

yes log4xxx медленнее, чем трассировка, поскольку трассировка обычно является инструментом почти ядра, а log4xxx - гораздо более мощным инструментом. Лично я предпочитаю log4xxx из-за этого fexibility, но если вы хотите что-то, что не влияет на столько, и вам не нужны журналы для производства, скажем, в отлаживании только трассировки должно быть достаточно.

Примечание. Я использую log4xxx, потому что то же самое относится ко всем языкам с библиотекой log4 не только .Net

Ответ 2

вам может быть интересна Библиотека Common.Logging. Он представляет собой тонкую абстракционную оболочку поверх существующих реализаций ведения журнала и позволяет подключать любые фреймворки регистрации, которые вам нравятся во время выполнения. Кроме того, он намного быстрее, чем System.Diagnostics.Trace, как описано в разделе сообщения в блоге о производительности.

НТН, Erich

Ответ 3

Из моего опыта производительность log4net в большинстве случаев не является проблемой. Реальный вопрос: зачем вам даже нужно "регистрировать вещи сотни тысяч раз" в производственной системе.
Как я вижу, в процессе производства вы должны регистрировать только минимальный уровень (информация может быть предупреждающим), и только если необходимо (отладить проблему на сайте), следует активировать отладку на уровне отладки.

Ответ 4

Если вы хотите получить лучшее из обоих миров, log4net позволит вам также войти в трассировщик aspnet. Я включаю этот параметр, когда хочу получить статистику производительности, привязанную к определенным событиям в моем протоколировании.

Ответ 5

Просто запустите тест, сравнивающий последовательность записи в простой файл, по сравнению с использованием Log4Net для той же задачи .Log4Net примерно в 400 раз медленнее сравнивается с StreamWriter.So Я считаю, что Log4Net не может использоваться, если вы пишете огромные лога. Но я нахожу его очень полезным для небольших количеств записей журнала и отладки.

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