类型:报告 · 建档:2026-06-29 | 时效性文档,引用前请核对正文的数据截止日
技术梳理 - 技术优化
一、日志级别优化
1. openapi 服务「未匹配到活动」误报 ERROR
问题来源
[2026-06-22 16:19:55.104 [openapi ERROR]
DubboServerHandler-172.21.80.107:20880-thread-167539
com.yili.mac.openapi.service.rpc.impl.RpcIPromotionServiceImpl:?]
未匹配到活动:外码:BR6DM0WAC051分析
外码扫码时未命中当前生效的营销活动,属于正常业务场景(活动有起止时间、区域限制、适用范围等条件),并非系统异常。将该日志记为 ERROR 会导致:
- 错误率监控指标被污染,真实错误被噪音淹没
- 若配置了错误告警,会触发无效告警,增加运维负担
- 日志看板中 ERROR 数量虚高,影响对系统健康度的判断
优化方案
- 将
RpcIPromotionServiceImpl中「未匹配到活动」的日志级别从 ERROR 降为 WARN 或 INFO - 若业务侧需要追踪未命中率,建议单独埋点统计,而非依赖 ERROR 日志
- 排查 openapi 服务中其他类似的「业务预期内结果」是否也存在 ERROR 误用,统一治理
涉及服务: openapi (sip-mac-openapi)
涉及类: com.yili.mac.openapi.service.rpc.impl.RpcIPromotionServiceImpl
二、日志内容格式优化
1. openapi 服务 MongoDB 查询对象多行打印导致日志解析失败
问题来源
[2026-06-22 16:49:59.749 [openapi INFO ]
DubboServerHandler-172.21.83.164:20880-thread-200779
com.yili.mac.openapi.service.rpc.impl.RpcIPromotionServiceImpl:?]
processPolicy结果:true, policy:"PAYEE_ROLE_TYPE", query:{
"restrictedTypes" : [ ],
"skip" : 0,
"limit" : 0,
"hint" : null,
...(省略数十行)
"queryObject" : {
"esi" : 1,
"proid" : 2225115,
"prove" : 3,
"sel.SALE_AREA" : { "$in" : [ "1-5ZFNPG", "880436", ... ] }
}后续每行被日志采集系统标记为 LogParseFailure,单次调用产生 97+ 条解析失败记录。
分析
RpcIPromotionServiceImpl 在记录 processPolicy 结果时,将 MongoDB 的 Query 对象直接 toString() 后打印到日志。该对象的默认 toString() 输出是多行格式化 JSON,导致:
- 日志采集系统(如 ELK/EFK)按行解析,多行内容每行都被识别为独立日志条目,无法匹配日志格式,触发大量
LogParseFailure - 单条业务日志膨胀为近百条垃圾记录,严重浪费存储和索引资源
- 日志检索时无法正确关联上下文,排查问题困难
- 干扰其他正常日志的聚合统计和告警规则
优化方案
- 日志中打印 MongoDB Query 对象时,使用单行 JSON 序列化(如
JSON.toJSONString(query)或自定义compactToString()),避免多行输出 - 若完整查询体对排查价值不大,可只记录关键业务字段(如
proid、prove、esi、SALE_AREA等),减少日志体积 - 排查 openapi 及其他服务中是否存在类似的 MongoDB/复杂对象多行打印问题,统一规范日志输出格式
涉及服务: openapi (sip-mac-openapi)
涉及类: com.yili.mac.openapi.service.rpc.impl.RpcIPromotionServiceImpl