一个(log.isDebugEnabled())条件每个调试语句出现

时间:2011-06-28 01:04:55

标签: java if-statement log4j logging

我想与社区核实,如果这是一种公认​​的做法,那么每个调试语句的多个if条件会在一行中出现:

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条件来包装整个日志语句,因为它们出现在一行中。你对此有何看法?或者你看到为什么原作者想要为每个调试语句设置if条件?

谢谢!

5 个答案:

答案 0 :(得分:5)

充其量,它是凌乱的。在最坏的情况下,它执行绝对冗余的函数调用。

共享if之间逻辑的唯一潜在差异是调试选项是否在呼叫中以某种方式更改(可能是通过配置重新加载)。但是,捕捉这个额外的半场电话确实不值得代价。

只需改变它。 Don't Repeat Yourself

if存在的原因是为了避免在未处于调试模式时构建调试字符串的开销。您应该保留的那部分(或者如果您发现这不是您的应用程序的性能关键部分,请不要保留。)

修改仅供参考,通过“更改”,我的意思是这样做:

if (log.isDebugEnabled())
{
  log.debug("rproductType = "+ producteType);
  log.debug("rbundleFlag = " + bundleFrlag);
  // etc
}

答案 1 :(得分:1)

if条件是为了提高速度。

旨在避免禁用的调试语句的计算成本。也就是说,如果您将日志级别设置为ERROR,则无需创建实际消息。

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

答案 2 :(得分:1)

我个人的感觉是

if  (log.isDebugEnabled())

语句是一种微观优化,只会使代码难以阅读。

我知道这曾经是log4j的最佳实践,但其中许多检查都是在日志本身(you can see in the source code)之前执行的,而您自己保存的唯一操作是字符串连接。我会删除它们。

答案 3 :(得分:1)

我会这样做:

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中。第一个阻止了构建器和几个短生命对象的创建(你会堆谢谢)

在这种情况下,第二个是obsolet。但这是一个非常简单的检查,所以我认为建造者的成本会更高。鉴于在大多数生产系统中调试级别已关闭,我认为这是最佳选择。

总结一下,当我的调试语句 - 或者我需要为调试消息做的其他事情 - 变得比平常更复杂时,我使用isDebugEnabled。在大多数情况下,这是字符串连接。

永远不要将isDebugEnabled用于单行日志语句。正如已经提到的那样。 log.debug方法自己调用它。

干杯 基督教

答案 4 :(得分:0)

<强>取决于即可。 Log4j 在调试语句之前检查每个方法的开头 - isDebugEnabled(),警告之前是isWarnEnabled(),等等 - 默认情况下。

这并不意味着不需要检查。 如果传递的任何参数调用,则检查可以保存。例如,如果未启用调试,LOGGER.debug(transformVars(a, b, c, d));将导致transform()的不必要执行!