Skip to content

类型:报告 · 建档: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