我想与社区核实,如果这是一种公认的做法,那么每个调试语句的多个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条件?
谢谢!
答案 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()
的不必要执行!