Да, операторы журнала будут по-прежнему выполняться. Вот почему рекомендуется сначала проверить уровень журнала: что-то вроде
if (log.isInfoEnabled()) {
log.info("My big long info string: " + someMessage);
}
Это необходимо для перераспределения пространства для информации String
, когда уровень журнала не поддерживает INFO
операторов.
Это совсем не то, что #ifdef
- #ifdef
- это директива компилятора, тогда как конфигурации Log4J обрабатываются во время выполнения.
Редактировать : Я ненавижу унижаться из-за невежества, поэтому вот одна статья, подтверждающая мой ответ.
С http://surguy.net/articles/removing-log-messages.xml:
В Log4J, если вы регистрируете сообщение на
Уровень отладки и текущий Appender
установлен только для регистрации сообщений INFO
уровень и выше, то сообщение будет
не будет отображаться Производительность
штраф за вызов метода журнала
само по себе минимально - несколько наносекунд.
Тем не менее, это может занять больше времени, чтобы
оцените аргументы в лог
метод. Например:
logger.debug ("Большой объект
«+ LargeObject.toString ()); * * тысячу двадцать-два
Оценка largeObject.toString () может
быть медленным, и это оценивается раньше
вызов в логгер, так логгер
не может помешать его оценке,
даже если он не будет использоваться.
Редактировать 2 : из самого руководства log4j (http://logging.apache.org/log4j/1.2/manual.html):
Пользователь должен знать о следующих проблемах производительности.
Производительность ведения журнала при выключенном ведении журнала.
Когда регистрация отключена полностью или только для набора уровней, стоимость запроса журнала состоит из вызова метода и целочисленного сравнения. На 233 МГц процессоре Pentium II эта стоимость обычно находится в диапазоне от 5 до 50 наносекунд.
Однако вызов метода включает «скрытую» стоимость создания параметра.
Например, для какой-то кошки-регистратора, пишущей,
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
несет затраты на создание параметра сообщения, то есть преобразование как целого числа i и записи [i] в строку, так и объединение промежуточных строк, независимо от того, будет ли сообщение записано в журнал или нет. Эта стоимость создания параметров может быть довольно высокой и зависит от размера используемых параметров.
Чтобы избежать стоимости строительства параметра напишите:
if(logger.isDebugEnabled() {
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
Это не приведет к затратам на создание параметров, если отладка отключена. С другой стороны, если в логгере включена отладка, он будет в два раза дороже оценивать, включен ли регистратор: один раз в debugEnabled и один раз в отладке. Это незначительные накладные расходы, потому что оценка регистратора занимает около 1% времени, необходимого для фактического ведения журнала.