Насколько быстр метод регистрации log4net (отладка, информация и т. д.)?

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

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

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

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

Так что пока исключим это из рассмотрения.


person casademora    schedule 07.10.2008    source источник
comment
Вы входите в консоль, в файл, в базу данных? Это имеет большое значение с точки зрения производительности.   -  person Ben Hoffstein    schedule 07.10.2008


Ответы (4)


Я не знаком с 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());

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

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

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

person Will Hartung    schedule 07.10.2008

Я знаю, что это старая тема, но как насчет использования подхода, который позволяет избежать заполнения кода операторами if на основе уровня журнала, например: http://www.beefycode.com/post/Extension

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

person Pablo Romeo    schedule 08.12.2012

В log4net FAQ есть ответ на этот вопрос, хотя не до уровня детализации, который вы ищете.

В итоге: используйте эти защитные оговорки.

person matt b    schedule 07.10.2008

Просто дайте ответ Уиллу Хартунгу с точки зрения .NET :)

Код DebugFormat:

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

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

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

person keisar    schedule 15.05.2012