1. 结论
- VIN 图片和 AES 成功响应日志优化已在生产生效;请求、返回、重试和业务处理未改动。
- 上线前后同一 15 分钟窗口对比:VIN 图片日志字符量下降 99.96%,AES 响应日志字符量下降 98.42%。
- 生产仍有独立的下游超时日志,主要集中在 AES 调用;当前没有证据表明超时由本次日志格式改造引起。
- 商品报价搜索响应摘要(
9451433c6b)尚未在生产生效,不能计入本次收益;下一步优先治理 VinAudit 服务端成功整包日志。
2. 本轮已完成
| 时间 | 优化项 | 优化结果 |
|---|---|---|
| 9/7 | VIN 图片识别 | 不再记录 imgData Base64,只记录图片大小、返回码、消息、VIN、重试码。提交 39f00f72ea。 |
| 9/8 | AES 成功响应 | 不再记录完整密文,统一记录 {"code":200,"data":"已加密"};业务仍返回原始响应。提交 cd27b0d5bb,9/10 已在生产核验生效。 |
Robot/AI 的入口去重、对象摘要和商品结果截断属于 9/4 之前的既有基线,本轮不重复计算。
3. 同时间窗口效果
统计窗口:上线前生产 logstash-2026-09-08、上线后生产 logstash-2026-09-10,均为 10:00–10:15;统计字段为 message.length(),单位是字符;两次查询均为 8/8 分片成功。
| 指标 | 9/8 上线前 | 9/10 上线后 | 变化 |
|---|---|---|---|
| 全部日志条数 | 4,336,103 | 3,114,372 | -28.2% |
| 全部日志字符量 | 6,106.3M | 4,283.4M | -29.9% |
| 平均单条 | 1,408 字符 | 1,375 字符 | -2.3% |
| AES 请求条数 | 14,083 | 11,655 | -17.2% |
| AES 请求字符量 | 641.6M | 613.8M | -4.3%(请求体未改) |
| VIN 图片日志 | 1,147 条 / 525.9M | 1,027 条 / 0.235M | 字符量 -99.96% |
default 响应日志(含 AES) | 19,684 条 / 1,144.6M | 17,082 条 / 18.0M | 字符量 -98.42% |
default 响应平均单条 | 58.1KB | 1.06KB | -98.18% |
说明:全部日志和 AES 请求量同时受业务流量影响,不能单独作为改造收益;VIN 日志和 AES 响应日志的字符量对比才是本次改造的直接结果。已加密 命中数用于确认新格式已生效,不作为流量对比指标。
4. 改造前后日志样例
4.1 VIN 图片识别
优化前:
[默认]调用接口#...# {"url":".../ext/v2/vin","data":{"imgData":"<Base64 图片>"}}
优化后:
VIN图片识别结果 {"image_data_bytes":...,"code":...,"message":...,"vin":...,"retry_code":...}
业务请求和识别结果不变,只移除公共日志中的图片内容。
4.2 AES 响应
优化前:
接口返回#请求ID#: ["{\"code\":200,\"data\":\"<完整密文>\"}"]
优化后:
接口返回#请求ID#: ["{\"code\":200,\"data\":\"已加密\"}"]
优化后样本单条约 153 字符;AES 失败、解密、密钥接口及业务返回值保持原逻辑。
5. 当前高量日志与治理计划
| 优先级 | 日志点 | 条数 | 字符量 | 占总量 | 平均单条 | 后续处理 |
|---|---|---|---|---|---|---|
| P0 | VinAudit 全量整包日志 | 95,608 | 1,858.9M | 36.9% | 19.4KB | 先治理 VinAudit 服务端正常成功整包;异常保留脱敏证据。其中下文四个核心接口占 945.9M 字符。 |
| P1 | AES 请求 | 12,449 | 605.9M | 12.0% | 48.7KB | 保留节点、RequestId、商品数、请求大小、耗时和错误信息;删除完整 data.content。 |
| P1 | OfferProvider 响应 | 18,815 | 259.8M | 5.2% | 13.8KB | 保留 SKU/invId、库存、价格和错误信息;删除重复商品详情和扩展数组。 |
| P2 | Robot/AI 内网日志 | 待重新统计 | 待重新统计 | — | — | 按相同 15 分钟窗口重新排名,继续处理联系人、会话和逐商品对象日志。 |
统计窗口为 9/9 10:00–10:15,当前总量约 5,037.3M 字符。前三类合计约 2,724.6M 字符,是后续主要优化对象。
5.1 VinAudit 四个核心接口量级
统计窗口:生产 logstash-2026-09-09 10:00–10:15;字符量按 message.length() 计算。8 个分片均查询成功。
| 接口 | 15 分钟日志条数 | 15 分钟字符量 | 同负载折算1小时 | 平均单条 | 最大单条 | 占四接口 | 主要大量来源 |
|---|---|---|---|---|---|---|---|
/product/search | 21,005 | 852.5M | 3,409.9M | 40.6K | 682.5K | 90.1% | VinAudit 服务端整包 833.1M |
/product/getAttributes | 1,140 | 37.3M | 149.1M | 32.7K | 1,968.8K | 3.9% | DGJ Provider 18.1M + VinAudit 服务端 17.4M |
/product/images | 14,331 | 21.2M | 84.9M | 1.48K | 320.7K | 2.2% | DGJ Provider 11.1M + VinAudit 服务端 9.9M |
/product/get_attributes_by_sku_ids | 26,472 | 34.9M | 139.7M | 1.32K | 660.8K | 3.7% | VinAudit 服务端 19.1M + DGJ Provider 15.9M |
| 合计 | 62,948 | 945.9M | 3,783.5M | 15.0K | 1,968.8K | 100% | VinAudit 服务端占 879.5M(93.0%) |
条数是“进入 Kibana 的日志数”,不是业务请求数。同一次调用可在 DGJ/Sale 调用端和 VinAudit 服务端重复记录。“1 小时”仅为按当前 15 分钟流量线性折算,不代表全天实际值。
按系统拆分后,四个接口的日志占用如下:
| 记录位置 | 当前记录方式 | 15 分钟条数 | 15 分钟字符量 | 占四接口 |
|---|---|---|---|---|
VinAudit 服务端 api/request | 一条同时记录 request、完整 response、costTime | 25,324 | 879.5M | 93.0% |
DGJ providers/VinAudit | 请求一条,完整响应另一条 | 27,240 | 45.4M | 4.8% |
Sale provider/vinAudit | config + responseBody 合并为一条 http_client | 10,199 | 19.0M | 2.0% |
| SAAS/OpenPlatform/其他调用端 | 调用端整包日志 | 185 | 1.94M | 0.2% |
5.2 原来的真实日志长什么样
下列结构来自同一生产窗口的真实日志。RequestId、VIN、IP、签名和服务站值已脱敏;数组在文档中用“N项”缩写,原日志中是完整展开的。
VinAudit 服务端的原始格式是:
.request.api.INFO: {
"requestId":"[已脱敏]",
"request":{"ip":"[已脱敏]","url":".../product/search?","header":{"sign":"[已脱敏]",...},"data":{...}},
"response":{"code":0,"message":"请求成功","data":{...}},
"costTime":292
}
DGJ 会把同一次调用再记两条:
RequestId#[已脱敏]# [默认]调用接口#[调用ID]# {"url":".../product/getAttributes","headers":{...},"data":{"sku_id":"1601000592",...}}
RequestId#[已脱敏]# 接口返回#[调用ID]#: ["{\"code\":0,\"message\":\"请求成功\",\"data\":{\"attributes\":[...],\"images\":[...],\"car\":[...]}}"]
Sale 会合并记一条:
provider.INFO: http_client {"time":0.277,"request_id":"[已脱敏]","url":".../product/search","method":"POST","config":"{完整请求}","responseBody":"{完整响应}"}
四个接口的真实样例摘要:
| 接口 | 真实请求样例 | 原响应中完整记录的内容 | 该样例日志长度 |
|---|---|---|---|
/product/search | cat_id=C40202、VIN 已脱敏 | category=39、brands=5、car_list=1、item_attribute=3、options=2、goods_category=38、products=10 | 14,330 字符 |
/product/getAttributes | sku_id=1601000592 | attributes=3、images=1、car=4;属性含 OE码=079198405D、结构类型=环保型、规格=Φ68.2*Φ24*H118.5 | 5,643 字符 |
/product/images | sku_ids=[B302021348] | map.B302021348.default 和完整 images URL 数组 | 1,305 字符 |
/product/get_attributes_by_sku_ids | sku_ids=[B302021348] | attributes 3 项和 images 对象;属性含 OE码=AV6N18D543AA、规格=260*200*35、材质=兰玻纤 | 1,462 字符 |
5.3 建议如何优化
不建议直接删除请求结果,而是将“正常全量整包”改为“正常摘要 + 异常脱敏证据”。
| 接口 | 正常成功必须保留 | 不再记录 | 仍能排查的问题 |
|---|---|---|---|
/product/search | RequestId、耗时、code、分类/品牌/关键字、VIN 是否存在及后6位、products/category/brands/car_list/item_attribute/options 数量 | 完整商品、车型、筛选项和属性数组 | 查了什么、返回多少商品、筛选项是否缺失、响应是否过慢 |
/product/getAttributes | RequestId、sku_id、耗时、code、属性/图片/品牌/车系/车型数量 | 完整属性树、车型树和图片 URL | 哪个 SKU 无属性、无图片、无适配车型或响应过大 |
/product/images | RequestId、输入 SKU 数、返回 SKU 数、图片数、缺失 SKU 数、耗时、code | 完整 OSS URL 数组 | 哪些 SKU 没有图片、图片数是否异常、下游是否超时 |
/product/get_attributes_by_sku_ids | RequestId、输入 SKU 数、返回 SKU 数、属性总数、图片总数、缺失 SKU 数、耗时、code | 完整 SKU 属性和图片对象 | 批量请求是否部分缺数据、返回量是否异常 |
统一保留原则:
- HTTP 超时、非 2xx、业务
code != 0、JSON 解析失败:保留脱敏后的请求和响应。 - 正常但超过耗时或响应大小阈值:记录 warning,保留摘要和大小,必要时开启指定 RequestId 的临时详细采集。
sign、Authorization、完整 User-Agent、完整 IP 不进入正常摘要日志。- 只改日志输出的副本;实际请求参数、响应对象、超时、重试和业务解析逻辑保持不变。
5.4 落地顺序
- VinAudit 服务端:先将
api/request的正常成功日志改为四接口摘要,这一层占四接口字符量 93.0%。 - DGJ Provider:在 VinAudit Provider 内按 URL 摘要请求/响应,不全局修改所有 Provider。
- Sale Provider:针对 VinAudit
http_client做专用格式化,不直接改共享 vendor 的全局日志行为。 - 验收:预发验证正常、空结果、超时、业务异常和 JSON 异常,上线后用同一 15 分钟窗口对比总字符、平均/最大单条及 RequestId 串联能力。
6. 2026-09-10 生产上线核验
核验窗口:生产 logstash-2026-09-10,10:00–10:15;8/8 分片成功。
| 核验项 | 结果 | 现场证据 |
|---|---|---|
| VIN 图片日志 | 通过 | 新格式命中 1,027 条;code=0 为 960 条、code=-102003 为 67 条,全部 retry_code=-1;未再出现 imgData 大字段。6 个生产节点均有新格式日志。 |
| AES 成功响应 | 通过 | {"code":200,"data":"已加密"} 命中 11,282 条;响应日志总量由 1,144.6M 降至 18.0M 字符。 |
| 业务返回 | 通过 | 改动仅作用于写日志时的字符串,AES 原始响应仍按原代码解析并返回;VIN 原有返回和重试分支未改。 |
| 商品报价摘要 | 尚未生效 | 生产仍能查到完整 goods/rows 响应,rowsCount 命中 0;提交 9451433c6b 不计入本次收益。 |
同期异常观察
| 指标 | 9/9 同时段 | 9/10 同时段 | 判断 |
|---|---|---|---|
cURL error 28(10:00–10:15) | 139 | 381 | 同期下游超时增加,不能直接归因于日志格式改造,需单独按下游地址和 RequestId 排查。 |
cURL error 28(15:08–18:20) | 4,973 | 5,200 | 同上;本次未发现由 VIN/AES 日志改造新增的 PHP 异常或解析错误。 |
上线前后同一窗口的精确异常关键词对比:
| 异常关键词 | 9/8 上线前 | 9/10 上线后 | 判断 |
|---|---|---|---|
PHP Fatal | 1 | 1 | 同一类报价接口内存耗尽,属于既有问题,与本次日志格式无直接关联。 |
Uncaught | 13 | 10 | 主要来自定时任务和其他服务 SQL 异常,未出现 VIN/AES 新增异常。 |
ProviderErrorException | 0 | 0 | 未发现。 |
RequestTimeoutException | 0 | 0 | 未发现。 |
AES加密失败 | 0 | 0 | 未发现。 |
cURL error 28 定位
| 窗口 | 总数 | DGJ default | 其他来源 | 抽样关联结果 |
|---|---|---|---|---|
| 9/9 10:00–10:15 | 139 | 138 | OfferProvider 1 | DGJ 抽样 RequestId 均关联 /security/aes/encode;另 1 条为 Sale /offer/search/list。 |
| 9/10 10:00–10:15 | 381 | 380 | VinAudit 1 | DGJ 抽样 RequestId 均关联 /security/aes/encode;另 1 条为 VinAudit /product/detail。 |
default 超时均在约 5 秒触发。9/9 有 101 条、9/10 有 338 条提示未收到响应体;另有 35/37 条已返回预计超过 1 MB 的响应长度。该现象指向 AES 下游超时或大响应处理,和本次“成功响应只记录 已加密”的日志改造无关;超时分支仍按原逻辑记录并抛出异常,需单独治理 AES 下游耗时和响应大小。
生产样例(已脱敏)
VIN 新日志:
[时间][INFO][devcenter] RequestId#[请求ID]# VIN图片识别结果
{"image_data_bytes":1086282,"code":0,"message":"[识别服务消息]","vin":"[VIN]","retry_code":-1}
AES 新日志:
[时间][INFO][default] RequestId#[请求ID]# 接口返回#[调用ID]#:
["{\"code\":200,\"data\":\"已加密\"}"]
日志中不再出现图片 Base64 或 AES 完整密文;请求 ID、返回码、VIN 识别结果和异常码仍可用于串联排查。
7. 2026-09-10 商品报价搜索日志上线核验
核验截至 20:26,目标提交为 9451433c6b。生产 OfferProvider 日志仍为完整 data.rows,没有出现摘要字段 rowsCount。
| 同一时段 | 响应日志 | 字符量 | 平均单条 | 最大单条 | 摘要命中 |
|---|---|---|---|---|---|
| 9/9 20:15–20:21:30 | 328 | 7.20M | 21,963 | 83,886 | 0 |
| 9/10 20:15–20:21:30 | 416 | 9.14M | 21,982 | 95,991 | 0 |
| 9/10 20:21:30–20:26:30 | 257 | 5.66M | 22,011 | 80,217 | 0 |
9/10 同一时段比 9/9 字符量增加 26.9%,主要是请求量增加 26.8%,没有观察到日志压缩收益。6 个 DGJ 节点均仍能看到完整商品响应。
生产 Prod-DGJ-1 的 /data/www/dist/application/Providers/SaleService/OfferProvider.php SHA-256 为 277ae1a3961321369c1110e1151c2930d25192a952488f9cd89682f408481933,与当前 develop 一致;目标提交文件 SHA-256 为 a207754f270b80d72ceefe9a3835e01c1fcb80793dbb13214cbf6df98fa272ce,两者不一致。说明目标代码尚未加载到该生产节点,需确认发布分支是否包含 9451433c6b 后再重新核验。
本窗口未发现由该改动引起的新增异常:PHP Fatal 来自报表大查询,Uncaught 来自定时任务;未命中 ProviderErrorException、RequestTimeoutException。本次未修改生产代码或配置。
8. 验收标准
每次发布后使用相同 15 分钟窗口核对:总字符量、条数、平均/最大单条、RequestId 串联能力、成功/异常样例和业务返回值。日志压缩只改变日志展示,不改变请求参数、响应变量和业务结果。
证据来源:Kibana logstash-2026-09-08、logstash-2026-09-09、logstash-2026-09-10;10:00–10:15 及异常观察窗口查询;代码提交 39f00f72ea、cd27b0d5bb。生产查询 8/8 分片成功,未修改生产数据或服务配置。