Я не знаком с 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, и мой код проверяет уровень ведения журнала, а затем форматирует сообщение соответствующим образом. Это почти так же быстро, как охранники, но гораздо чище писать.
Теперь log.DebugFormat вполне может сделать нечто подобное, чего я не знаю.
Помимо этого, конечно же, указана фактическая стоимость регистрации (на экран, в файл, на сокет и т. Д.). Но это просто стоимость, которую вы должны принять. Моя лучшая практика для этого, когда это целесообразно, - направлять фактические сообщения журнала в очередь, которая затем собирается и выводится на соответствующий канал, используя отдельный поток. Это, по крайней мере, помогает не входить в систему в соответствии с основными вычислениями, но имеет свои затраты и сложность.