调试程序的时候,我们总是希望日志越多越好,越详细越好,恨不得把每个变量的每次变化都打印出来。碰到对象,也转换成JSON格式打印出来,方便又好看。所以,有时候,我们会不小心写出下面这样的代码。
ObjectMapper objectMapper = new ObjectMapper()
log.info(objectMapper.writeValueAsString(something));
上面的代码里有个坑,很坑的那种坑。
这个坑在功能测试时不会表现出来,要在生成环境上,在产品大火,用户猛涨,请求暴增的关键时刻,它才会蹦出来,保证让你在老板面前露个脸。
这个坑其实很明显,有经验的小伙伴一眼就能看出来,不论日志等级怎么设置,objectMapper.writeValueAsString(something) 这段代码是一定会执行的。虽然对象转JSON效率很高,消耗很小,但这很小的消耗,相对于打日志来说,还是很大的。所以,在高并发的时候,这段代码就会成为性能瓶颈。
logback 官网上也提到了类似问题,他给的例子是这样的:
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
他给出的第一个解决方法是这样的,打日志前判断一下要不要打: