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

Зачем вызывать IsDebugEnabled в log4net?

Мне любопытно, почему я вижу, как люди записывают logging-код log4net следующим образом:

if (_logger.IsDebugEnabled)
{
    _logger.Debug("Some debug text");
}

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

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

Такое же поведение наблюдается и для других уровней (Info, Error, Warn, Finest и т.д.).

4b9b3361

Ответ 1

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

Другой шаблон, который решает эту проблему:

_logger.Debug(() => "Some expensive text");

Я не знаю, поддерживает ли log4net что-то подобное.

Ответ 2

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

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

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

Ответ 3

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

Вместо того, чтобы делать все это, если уровень журнала установлен выше DEBUG, иногда бывает лучше проверить, поэтому предотвращение выполнения дополнительной работы, если оно не будет регистрироваться в любом случае.

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