是否需要执行 if(log.isDebugEnabled()) { ... } 检查?

2022-08-31 20:03:20

是否需要执行显式 if(log.isDebugEnabled()) { ... } 检查?

我的意思是,我看到一些帖子提到log.debug(“something”)在进行日志记录之前执行隐式调用以查看是否已启用调试模式日志记录。我是否遗漏了某些内容,或者在使用之前要执行的中间步骤?

谢谢!

log.debug("ResultSet rs is retrieved from OracleTypes");

if(log.isDebugEnabled()){
     log.debug("ResultSet rs is retrieved from OracleTypes");
}

编辑:写了一篇关于这个的文章:http://java.sg/whether-to-do-a-isdebugenabled-checking-before-printing-out-your-log-statement/


答案 1

声明:

if(log.isDebugEnabled()){

仅用于性能原因。它的使用是可选的,因为它是由 log 方法在内部调用的。

但是现在你问这个检查是否是内部进行的,那么我为什么要使用它呢?这很简单:如果你记录像这样简单的东西:

log.debug("ResultSet rs is retrieved from OracleTypes");

然后,您无需进行任何检查。如果使用 append 运算符 (+) 编写要记录的字符串,如下所示:

log.debug("[" + System.getTimeInMillis() + "] ResultSet rs is retrieved from OracleTypes");

在这种情况下,您应该检查日志是否启用,因为如果未启用,即使未创建日志,字符串组合也是如此。我必须提醒您,使用运算符“+”来连接字符串是非常低效的。


答案 2

我知道这已经很旧了,但对于任何只是找到这个的人来说...

如果使用 SLF4J,则可以通过使用消息传递格式来避免 isDebugEnabled() 调用。

例如,而不是:

Object entry = new SomeObject();
logger.debug("The entry is " + entry + ".");

用:

Object entry = new SomeObject();
logger.debug("The entry is {}.", entry);

除非启用调试,否则不会评估消息格式。

因此,对于简单的情况,您可以避免 isDebugEnabled()。

但是,在构建其中一个参数可能很昂贵的情况下,您仍然希望使用isDebugEnabled()(即使使用SLF4J)。

例如:

if (logger.isDebugEnabled()) {
    logger.debug("Here is the SQL: {}", sqlWrapper.buildSQL());  // assume buildSQL() is an expensive operation
}

在这种情况下,除非实际启用了调试,否则您不想评估buildSQL()。

对于SLF4J,关于总是使用它与有选择地使用它存在一些争论。这真的归结为个人喜好。您可能希望在任何地方使用,以防止其他开发人员(在不知不觉中)将您的日志消息更改为将来更复杂/更昂贵的消息。


推荐