Одно (log.isDebugEnabled ()) условие для каждого появления оператора отладки - PullRequest
1 голос
/ 28 июня 2011

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

if (log.isDebugEnabled()) log.debug("rproductType = "+ producteType);
if (log.isDebugEnabled()) log.debug("rbundleFlag = " + bundleFrlag);
if (log.isDebugEnabled()) log.debug("rmrktSegment = " + mrktSeegment);
if (log.isDebugEnabled()) log.debug("rchannelTy = " + channelrTy);
if (log.isDebugEnabled()) log.debug("rcompanyPartner = " + coempanyPartner);
if (log.isDebugEnabled()) log.debug("rpreSaleDate = " + preSaleDaete);
if (log.isDebugEnabled()) log.debug("rportNC = " + portrNC);
if (log.isDebugEnabled()) log.debug("rLDC debug end");

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

Спасибо!

Ответы [ 5 ]

5 голосов
/ 28 июня 2011

В лучшем случае, это грязно. В худшем случае он выполняет абсолютно избыточные вызовы функций.

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

Просто измени это. Не повторяйся

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

Редактировать К вашему сведению, под "изменить это" я имею в виду сделать это вместо этого:

if (log.isDebugEnabled())
{
  log.debug("rproductType = "+ producteType);
  log.debug("rbundleFlag = " + bundleFrlag);
  // etc
}
1 голос
/ 28 июня 2011

Я бы сделал это так:

if (log.isDebugEnabled()) {
  StringBuilder builder = new StringBuilder();
  builder.append("rproductType = ");
  builder.append(producteType);
  builder.append("rbundleFlag = ");
  builder.append(bundleFrlag);
  builder.append("rproductType = ");
  builder.append(mrktSeegment);
  builder.append("rchannelTy = ");
  builder.append(channelrTy);
  builder.append("rcompanyPartner = ");
  builder.append(coempanyPartner);
  builder.append("rpreSaleDate = ");
  builder.append(preSaleDaete);
  builder.append("rportNC = ");
  builder.append(portrNC);
  builder.append("rLDC debug end");
  log.debug(builder.toString());
}

В этом коде есть только 2 проверки isDebugEnabled: одна в начале, другая в log.debug. Первый предотвращает создание строителя и нескольких короткоживущих объектов (куча поблагодарит вас)

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

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

Никогда не используйте isDebugEnabled для однострочных операторов журнала. Как уже было сказано. метод log.debug вызывает его сам.

Приветствие Christian

1 голос
/ 28 июня 2011

Мое личное мнение таково, что

if  (log.isDebugEnabled())

- это микрооптимизация, которая только затрудняет чтение кода.

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

1 голос
/ 28 июня 2011

Условие if для увеличения скорости.

Он предназначен для того, чтобы избежать вычислительных затрат отключенных операторов отладки. То есть, если для вашего уровня журнала установлено значение ОШИБКА, создавать сообщение не нужно.

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Category.html

0 голосов
/ 28 июня 2011

Зависит .Log4j выполняет эту самую проверку в начале каждого метода - isDebugEnabled() перед оператором отладки, isWarnEnabled() перед предупреждением и т. Д. - по умолчанию.

Это не означает, что проверкине требуется. Проверки могут сохранить обработку, если какой-либо из переданных параметров вызывает вычисление .Например, LOGGER.debug(transformVars(a, b, c, d)); приведет к ненужному выполнению transform(), если отладка не включена!

...