Scala LazyLogging是否需先判断Debug启用状态再执行日志输出?
Scala LazyLogging 是否需要前置Debug级别判断?
好问题!从Java转到Scala的时候,很容易带着之前的编码习惯来写代码,但其实在使用LazyLogging特质时,完全不需要像Java那样先判断isDebugEnabled,原因我给你捋清楚:
先回顾Java里为什么要做判断
在Java中,日志方法的参数是立即求值的。比如你写:
logger.debug("Debug info: " + veryBigSeq.toString());
哪怕当前日志级别不是Debug,veryBigSeq.toString()这个昂贵的计算也会先执行完毕,再传入debug方法——而方法内部发现级别不够又会直接丢弃这个参数,白白浪费了资源。所以Java里必须加一层判断:
if(logger.isDebugEnabled()) { logger.debug("Debug info: " + veryBigSeq.toString()); }
这样只有当Debug级别启用时,才会执行参数的计算逻辑。
Scala LazyLogging的优化:传名参数
LazyLogging(通常来自com.typesafe.scalalogging库)的日志方法使用了Scala的**传名参数(by-name parameter)**特性。它的debug方法签名大概是这样的:
def debug(msg: => String): Unit
这里的=> String就是关键——它表示参数msg不是立即求值的,而是只有当方法内部真正需要用到这个值的时候,才会去执行对应的表达式。
回到你的示例代码:
class Test extends LazyLogging{ val veryBigSeq: Seq[String] = // 初始化一个很大的序列 logger.debug(veryBigSeq.toString()) }
当Debug级别未启用时,veryBigSeq.toString()这个表达式根本不会被执行,自然不会产生不必要的性能开销。完全不需要额外加if(logger.isDebugEnabled)的判断。
总结
用Scala的LazyLogging时,直接写logger.debug(xxx)就好,它已经通过传名参数帮你实现了延迟求值,和Java里加判断的效果完全一样,但代码更简洁。
内容的提问来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

