JSON格式打印日志的坑

在高并发环境中,将对象转换为JSON格式打印日志可能导致性能瓶颈。即使日志级别设置得较高,`objectMapper.writeValueAsString(something)`仍会执行。Logback官网建议在打日志前进行条件判断或使用带参数的日志函数,但这些方法都有局限。一种解决方案是重写对象的`toString`方法,另一种是创建一个专门的包装类来处理JSON转换,或者实现一个MessageConverter来优雅地处理JSON日志打印。
摘要由CSDN通过智能技术生成

       调试程序的时候,我们总是希望日志越多越好,越详细越好,恨不得把每个变量的每次变化都打印出来。碰到对象,也转换成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]));

        他给出的第一个解决方法是这样的,打日志前判断一下要不要打:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值