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

Является ли Log4j isDebugEnabled() необходимым перед использованием logger.debug()?

Когда я просматривал какой-то код, я заметил использование регистратора следующим образом:

if(logger.isDebugEnabled())   
    logger.debug("Something..");

Но в некоторых кодах я наблюдал подобное.

logger.debug("Something..");

Когда я посмотрел на источник log4j, в методе debug() самого Logger if(logger.isDebugEnabled()) был проверен. Тогда зачем нам нужны лишние накладные расходы if(logger.isDebugEnabled())??

4b9b3361

Ответ 1

Полезно, когда строка, передаваемая в logger.debug(...), требует времени для оценки, в этом случае вы можете пропустить эту оценку, если отладка не включена.

if(logger.isDebugEnabled()) {
    logger.debug("The meaning of life is " + calculateMeaningOfLife());
}

IMO делает код намного менее удобочитаемым, поэтому его следует использовать только при значительном улучшении производительности.

Ответ 2

isDebugEnabled обычно используется, чтобы избежать ненужного объединения строк, например, этот вызов

logger.debug("Line number = " + n);

сначала вызывает конкатенацию строк, затем debug(), и только тогда Logger обнаруживает, что отладка не включена и просто возвращается. Это может существенно повлиять на производительность приложения.

Эта проблема решена в SLF4J, которая имеет отформатированные методы ведения журнала, подобные этой

public void debug(String format, Object arg);

Ответ 3

Java должна сначала разрешить параметр строки, переданный методу отладки, прежде чем он сможет его вызвать.

logger.debug("Something.. var1=" + variable1 + "  var2=" + variable2);

Приведенный выше код приведет к созданию нескольких объектов String, поскольку каждый + создает другую String, поэтому перед вызовом метода вы создадите около 5 или более объектов.

Отладка в основном не будет включена, поэтому более эффективно проверять, включена ли отладка, чем разрешать параметры все время.

Ответ 4

Заявление:

if(log.isDebugEnabled()){

Используется только по соображениям производительности. Он не является обязательным, поскольку он вызывается методом журнала внутри.

Но теперь вы спрашиваете, сделана ли эта проверка внутри, так почему я должен ее использовать? Это очень просто: если вы зарегистрируете что-то простое:

log.debug("ResultSet rs is retrieved from OracleTypes");

Тогда вам не нужно делать никаких проверок. Если вы создаете строку для записи с помощью оператора append (+) следующим образом:

log.debug("[" + System.getTimeInMillis() + "] ResultSet rs is retrieved from OracleTypes");

В этом случае вы должны проверить, включен ли журнал, или нет, потому что, если это не так, даже если журнал не выполнен, составная строка. И я должен напомнить вам, что использование оператора "+" для конкатенации строк очень неэффективно.

Ответ 5

Реализация SLF4J (проверена на версии 1.7.10) вызывает isDebugEnabled() в некоторых методах вроде:

public void debug(String format, Object... arguments) {
    if(this.log.isDebugEnabled()) {
        FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
        this.log.debug(ft.getMessage(), ft.getThrowable());
    }
}

но есть также перегрузки методов, которые не проверяют внутреннюю проверку того, включен ли заданный уровень loggin, например:

public void debug(String msg, Throwable t) {
    this.log.debug(msg, t);
}

Другое дело, что реализация Logger может быть изменена, поэтому, если вы хотите, чтобы всегда был уверен, что ваш журнал вызывается в соответствии с уровнем ведения журнала, вам может потребоваться использовать метод isDebugEnabled().