打日志还能打出个线上Bug_ 太难了。。。
某日中午,收到告警,有一笔订单下单失败了。赶紧去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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架