13

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

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

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

3 回答 3

21

在您的示例中,不需要“if”语句(“if”之间不是循环)

但是如果你看下面的例子,你可以看到我们做了一个连接,如果日志级别是 info,那么这个连接操作就会不必要地完成。为了获得更好的性能,我们检查这个条件。

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

额外信息:

使用 slf4j 来避免这种 if 条件。上面的语句在 slf4j 中可以改写如下,

log.debug("I am logging {} .", 1234);
于 2012-05-03T09:29:42.007 回答
2

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

例子:

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

Arrays.toString()如果未启用调试,则不执行方法和连接。如果没有if,则首先调用它并稍后检查,仅此而已;-)

我的观点是,当您的示例中有简单的 String 时,不需要围绕日志记录的 if,如果有更复杂的东西(在我的示例中甚至更复杂),这可以在生产模式下节省一些 CPU 时间(没有调试模式启用)。

您还必须意识到,在连接的情况下,如果您认为它没有调用任何业务逻辑String.valuOf()toString()因此它是“无用的”)。

于 2012-05-03T09:23:29.233 回答
2

这是一个性能优化。这样做是为了避免评估log.debug. 只有在构建日志消息特别昂贵(例如序列化 XML 文档)时才值得这样做。

这在log4j 的简短介绍中有一些详细介绍。

于 2012-05-03T09:26:30.967 回答