打日志还能打出个线上Bug,太难了。。。
共 1130字,需浏览 3分钟
·
2020-12-27 20:29
某日中午,收到告警,有一笔订单下单失败了。赶紧去 Cat 看了下错误信息,如下:
Web 应用调用订单服务的 RPC 接口报错了,一看错误很自主的认为这是一个序列化的问题。后面排查下来发现压根就不是,这个错误报的有点。。。
想着是不是参数中有什么特别的东西,然后发现也没有什么特别的。这个错误是某个商品下单才会出现,不是所有的商品都会出现这个问题。
然后尝试在本地复现,有这么一行关键的代码,贴了一部分,完整的作用是埋点打日志。
String.format("UnifiedOrderServiceImpl.makeOrder创建订单, make order, request: MakeOrderRequest= "+ request)
说实话我是没看懂这里用 String.format 的原因在哪里,不就是想拼接个字符串么?还搞个 format,搞就搞嘛,还没用占位符,骚操作。
真正 Bug 的原因是 request 对象中有个 String 类型的字段,字段里面的内容有%\,format 内部就报错了,大家可以用下面这段代码复现错误:
public static void main(String[] args) {
String.format("dsdsdsd"+"%\\sdsd");
}
错误信息:
Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '\'
原因是在 format 中会校验参数,然后触发了异常。
虽然是很小的改动,就记录个日志而已,但也不要轻视,往往就是不够仔细,然后才会出这种问题。
总结:
认真对待每一行代码 做好 code review
关于作者:尹吉欢,简单的技术爱好者,《Spring Cloud 微服务-全栈技术与案例解析》, 《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号猿天地发起人。
我整理了一份很全的学习资料,感兴趣的可以微信搜索「猿天地」,回复关键字 「学习资料」获取我整理好了的 Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC 分库分表,任务调度框架 XXL-JOB,MongoDB,爬虫等相关资料。
后台回复 学习资料 领取学习视频
如有收获,点个在看,诚挚感谢