2008-10-07 2 views
6

Я большой поклонник log4net, но недавно некоторые (в моем отделе) опросили его включение в наши проекты из-за кажущейся тяжести каждого метода ведения журнала. Я бы сказал, что есть лучшие методы, чем другие, но это другой вопрос.Насколько быстрый метод ведения журнала log4net (Debug, Info и т. Д.)?

Мне любопытно узнать, каково типичное влияние вызова типа log4net DebugFormat на ваши приложения. Я собираюсь оставить переменные, такие как количество операторов журнала в строках кода и т. Д., Потому что я просто ищу все, что вы видели в реальном мире.

И я отдаю себе отчет в простой технике добавления предложения сторожевого к длительным отчетности по оценке, например:

if (log.IsDebug) 
{ 
    log.DebugFormat(...); 
} 

Итак, давайте исключить, что из рассмотрения на данный момент.

+0

Заходите ли вы в консоль, в файл, в базу данных? Это имеет большое значение с точки зрения производительности. – 2008-10-07 15:19:27

ответ

11

Я не знаком с log4net или log.DebugFormat (...).

Но стоимость лесозаготовок действительно в двух областях.

Первый вызов журнала, а второй - фактическое сохранение информации журнала.

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

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

Например, в log4j, это был общий язык:

log.debug("Runtime error. Order #" + order.getOrderNo() + " is not posted."); 

Здесь, стоимость является фактическим вычислением выражения строки, делающим сообщение. Это связано с тем, что независимо от уровня ведения журнала, это выражение и результирующая строка создаются. Представьте себе, если бы вместо того, чтобы у вас было что-то вроде:

log.debug("Something wrong with this list: " + longListOfData); 

Это может создать большую и дорогую строковую переменную, которая, если уровень журнала не был установлен на DEBUG, будет просто впустую.

Стражники:

if (log.isDebug()) { 
    log.debug(...); 
} 

Устранить эту проблему, так как вызов isDebug дешево, особенно по сравнению с фактическим созданием аргумента.

В моем коде, я написал обертку для лесозаготовок, и я могу создавать журналы, как это:

log.debug("Runtime error. Order # {0} is not posted.", order.getOrderNo()); 

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

Теперь, журнал.DebugFormat вполне может сделать то же самое, чего я не знаю.

В дополнение к этому, конечно, это фактическая стоимость регистрации (на экране, в файл, в сокет и т. Д.). Но это всего лишь стоимость, которую вам нужно принять. Моя лучшая практика для этого, когда это практично, состоит в том, чтобы направлять фактические сообщения журнала в очередь, которая затем извлекается и выводится на правильный канал с использованием отдельного потока. Это, по крайней мере, помогает вести журнал несовместимости с основными компьютерами, но у него есть свои затраты и сложность.

3

Просто Давая ответ будет Гартунг в .NET, перспективы :)

код DebugFormat является:

if (IsDebugEnabled) 
{ 
    Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null); 
} 

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

бы оставил комментарий, но я не хватает репутации:/

6

Я знаю, что это старый нить, но как об использовании такого подхода, который позволяет избежать заполнения кода, если заявления основаны на уровне протокола, таких, как этот: http://www.beefycode.com/post/Extension-Methods-for-Deferred-Message-Formatting-in-Log4Net.aspx

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