启用日志调试检查java

时间:2012-05-03 09:18:51

标签: java logging log4j

在这里使用if语句有什么意义?可以在log4j.xml配置文件中更改严重性级别。如果严重性级别是debug,它将记录调试消息,否则不会。

下面的if语句有什么意义?

   if (log.isDebugEnabled())
    {
        log.debug("I am logging something");
    }

3 个答案:

答案 0 :(得分:17)

在你的例子中,不需要'if'语句('if'不是循环之间)

但是如果你采用下面的例子,那么你可以看到我们进行连接,如果日志级别是信息,则不必要地进行这种连接操作。为了获得更好的性能,我们会检查这种情况。

if (log.isDebugEnabled())
{
    log.debug("I am logging " + 1234 + ".");
}

额外信息:

使用slf4j来避免这种情况。上面的语句可以在slf4j中重写如下,

log.debug("I am logging {} .", 1234);

答案 1 :(得分:2)

这被认为是一种很好的做法。例如,如果存在一些字符串连接,则不会在log4j中对其进行评估和检查,但会先检查它。

示例:

if ( log.isDebugEnabled() ) {
    log.debug( "N=" + N + ", a=" + Arrays.toString( a ) );
}

方法Arrays.toString()如果未启用调试,则不会执行连接。如果没有if,则先调用它并稍后检查,这就是全部; - )

我的观点是,当你的例子中有简单的字符串时,如果不需要日志记录,如果有更复杂的东西(在我的例子中更复杂),这可以在生产模式中节省一些CPU时间(没有启用调试模式)。

你还必须意识到,在连接的情况下,有String.valuOf()调用(对于非空对象)调用toString()方法,这对于大数据对象来说可能是真正的性能问题(bean许多属性)如果你认为它没有调用任何业务逻辑(因此它是“无用的”)。

答案 2 :(得分:1)

这是一项性能优化。这样做是为了避免评估log.debug的参数。如果构建日志消息特别昂贵(例如序列化XML文档),那么这是值得做的。

Short introduction to log4j中详细介绍了这一点。