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