一、概述
做後端開發,除錯(BUG 定位)有一個讓人頭疼的固定流程:打開日誌平台,輸入 traceId 或關鍵詞,搜尋日誌;從幾十到上百條日誌裡,找到關鍵的那幾條;把日誌裡的類名、方法名複製出來,去 IDE 裡找對應程式碼;結合程式碼邏輯,判斷哪裡出了問題;如果一次找不準,回去再搜日誌,再翻程式碼……
這個過程相對固定,但非常耗時。每次 BUG 定位,光在日誌平台和 IDE 之間來回切換,就能消耗掉大半的時間。
最開始在去年 Q3 想到這個問題時,腦子裡浮現的第一個方案是:用 Cursor + MCP,把日誌平台接進來,再掛一個程式碼知識庫,讓 AI 幫我查日誌。但這個方案有缺陷 —— 日誌查詢是「動態的」,它依賴環境、應用、時間範圍,沒辦法靜態預置。此外,這樣處理沒有辦法做到比較順暢地讀程式碼、改程式碼。
後來開始用 Claude Code,接觸到了 Skill 的概念:可以在專案裡定義一套自定義命令,描述 AI 應該怎麼執行這個命令的每個步驟,於是整個思路變得清晰了。
日誌平台有 MCP,Claude Code 有 Skill,兩者結合,就能讓 AI 自動完成「查日誌 → 找關鍵資訊 → 掃描程式碼 → 定位問題」這整個閉環。然後在 PM 的幫助下,才有了 /log-diagnosis 這個 Skill。
日誌平台推出了基於 MCP(Model Context Protocol)協議的日誌查詢服務,讓 Claude 可以直接調用日誌平台的能力,無需人工在日誌平台上手動查詢。
MCP 本質上是一種標準化的「工具調用協議」,Claude Code 通過 SSE(Server-Sent Events)長連接與 MCP Server 通訊,實時獲取日誌資料。
secretKey(日誌平台後台申請)
↓ acquireTokenTool
accessToken(1小時有效,最多同時存在5個)
↓ 携帶 accessToken
logsQuery / logSqlQuery / countLogTool ...
secretKey 申請地址:進入日誌管理後台 → 日誌權限 → 我的應用 → 生成密鑰。
log-diagnosis 是一個運行在 Claude Code 裡的自定義診斷命令。Claude Code 支援通過 .claude/skills/ 目錄定義自定義技能(Skill),以 Markdown 檔描述行為規範,Claude 在收到對應命令時會自動加載並執行。你只需要把 traceId 或告警資訊告訴它,剩下的全部交給 AI。完整執行鏈路如下:
使用者輸入 /log-diagnosis {環境} {程式碼分支} {訴求}
↓
Claude 加載 .claude/skills/log-diagnosis/SKILL.md
↓
讀取 .diagnosis/config.json 獲取當前環境配置
↓
檢查 accessToken 是否過期,過期則自動刷新
↓
從 traceId 計算日誌時間範圍(取第9-16位16進制時間戳)
↓
調用日誌平台 MCP 分頁拉取全量日誌(最多20頁,不遺漏)
↓
切換到指定程式碼分支,結合日誌關鍵詞檢索程式碼
↓
綜合分析:上游日誌 + 當前服務日誌 + 程式碼邏輯 → 根因
↓
生成診斷報告(飛書文件 or 本地 Markdown)
↓
恢復原始程式碼分支
# 格式
{field} {操作符} "{值}" {連接符} {field} {操作符} "{值}"
# 操作符
= : 精確匹配
≈ : 模糊匹配(like)
# 連接符
AND / OR / NOT
# 範例
trace_id = "a1b2c3d4e5f6789012345678abcdef01"
trace_id = "xxx" AND log_level = "ERROR"
endpoint ≈ "/api/your-endpoint" AND log_level = "ERROR"
message ≈ "timeout"
注意:時間範圍只通過 start/end 參數控制,不要寫在 queryString 中。
在 Claude Code 命令列中執行,按需安裝對應環境:
# 測試環境
claude mcp add --transport sse dw-log-mcp-t1 https://{your-t1-aigw-domain}/api/v1/mcp/log-mcp/sse
# 預發環境
claude mcp add --transport sse dw-log-mcp-pre https://{your-pre-aigw-domain}/api/v1/mcp/log-mcp/sse
# 生產環境
claude mcp add --transport sse dw-log-mcp-prd https://{your-prd-aigw-domain}/api/v1/mcp/log-mcp/sse
安裝後重啟 Claude Code,執行 /mcp 確認連線狀態正常。
建議按需安裝 MCP Server,避免額外消耗 token,示例配置:
{
"mcpServers": {
"dw-log-mcp-t1": {
"url": "https://{your-t1-aigw-domain}/api/v1/mcp/log-mcp/sse"
},
"dw-log-mcp-pre": {
"url": "https://{your-pre-aigw-domain}/api/v1/mcp/log-mcp/sse"
},
"dw-log-mcp-prd": {
"url": "https://{your-prd-aigw-domain}/api/v1/mcp/log-mcp/sse"
},
"dw-log-mcp-oversea-prd": {
"url": "https://{your-oversea-aigw-domain}/api/v1/mcp/log-mcp/sse"
}
}
}
將 log-diagnosis 目錄放到專案的對應目錄下:
your-project/
└── .claude/
└── skills/
└── log-diagnosis/
├── SKILL.md # 技能行為規範(核心)
├── README.md # 使用說明
└── reference.md # 附錄:時間腳本、queryString 範例等
your-project/
└── .cursor/
└── skills/
└── log-diagnosis/
├── SKILL.md # 技能行為規範(核心)
├── README.md # 使用說明
└── reference.md # 附錄:時間腳本、queryString 範例等
首次執行會自動引導建立(直接呼叫 /log-diagnosis,Skill 會一步步指示你給出 secret key),也可手動在專案根目錄建立 .diagnosis/config.json。
字段說明:
secretKey:唯一需要人工填寫的字段,在日誌平台後台申請;
accessToken:首次使用時由 AI 自動調用 acquireTokenTool 獲取,過期自動刷新;
accessTokenExpireAt:從 acquireTokenTool 返回值自動填充;
fields:調用 logFields 工具自動獲取。
命令格式:
/log-diagnosis {環境} {程式碼分支(可選)} {訴求描述}
參數說明:
範例:
# 用 traceId 定位介面異常
/log-diagnosis T1 feature/your-branch trace_id: "your-trace" 為什麼最終沒有返回資料
# 用告警資訊分析錯誤原因
/log-diagnosis PRD master 告警詳情:【介面:YourService/yourMethod】【業務碼:10002000】【業務碼消息:系統異常,請稍後重試】幫我分析問題可能性
一行命令,AI 全程接管,幾分鐘內給出根因分析。
某搜尋介面在測試環境回報沒有返回資料。拿到 traceId,直接執行:
/log-diagnosis T1 feature/your-branch trace_id: "your-trace" 為什麼最終沒有返回資料
← 就這一句話,接下來全部交給 AI。
Skill 觸發後,AI 自動完成:
請求入參(從日誌自動提取):
{
"assembleByOrg": true,
"channelType": "MANUAL",
"orderNo": "your-order-no",
"status": 1,
"ticketNo": "your-ticket-no"
}
AI 自動識別出關鍵節點:resultList is empty,SQL 查詢返回了空結果。問題在 DB 層,而不在業務邏輯層。
從日誌中提取到 toSearchDTO 組裝結果:
{
"channelType": "MANUAL",
"customerTag": 1,
"deliveryMode": "某配送方式",
"orderStatus": "8010",
"orderType": "0",
"productCategoryIds": [29],
"status": 1,
"ticketSource": 67,
"ticketTypeId": 5802
}
ORM 框架在日誌中打印了實際執行的 SQL,AI 直接讀取並分析:
SELECT a.id, a.pid, a.name, a.mode, a.status, a.org_id, a.org_ids,
a.ticket_group_id, a.tenant_id, a.is_del, a.channel_types
FROM your_type_table a
LEFT JOIN your_relation_table b
ON b.tenant_id = 1 AND a.id = b.type_id AND b.type = 3 AND b.is_del = 0
WHERE a.tenant_id = 1 AND a.mode = 2 AND a.is_del = 0
AND a.status = 1
AND (a.channel_types IS NULL OR a.channel_types = '' OR FIND_IN_SET('MANUAL', a.channel_types) > 0)
AND (b.root_id is null or b.root_id in (29))
AND (a.order_types IS NULL OR a.order_types = '' OR FIND_IN_SET('0', a.order_types) > 0)
AND (a.order_statuses IS NULL OR a.order_statuses = '' OR FIND_IN_SET('8010', a.order_statuses) > 0)
AND (a.delivery_modes IS NULL OR a.delivery_modes = '' OR FIND_IN_SET('某配送方式', a.delivery_modes) > 0)
AND (a.ticket_sources IS NULL OR a.ticket_sources = '' OR FIND_IN_SET(67, a.ticket_sources) > 0)
AND (a.customer_tag IS NULL OR a.customer_tag = 1) ← BUG 在此
AI 發現:其他欄位都處理了 IS NULL 和 = ''(空字串代表「不限制」)兩種情況,唯獨 customer_tag 只判斷了 IS NULL,遺漏了空字串 '' 的情況。
SQL 語義對比:
-- 其他欄位(正確):IS NULL 和 '' 都處理了
AND (a.order_types IS NULL OR a.order_types = '' OR FIND_IN_SET('0', a.order_types) > 0)
AND (a.delivery_modes IS NULL OR a.delivery_modes = '' OR FIND_IN_SET('某配送方式', a.delivery_modes) > 0)
AND (a.ticket_sources IS NULL OR a.ticket_sources = '' OR FIND_IN_SET(67, a.ticket_sources) > 0)
-- customer_tag(遺漏了 = '' 的判斷)← BUG
AND (a.customer_tag IS NULL OR a.customer_tag = 1)
DB 中現有的資料,customer_tag 欄位都存的是空字串(未配置),按業務語義本應匹配所有請求,卻因為這個遺漏被全部過濾掉了。
AI 在程式碼中直接找到對應的 MyBatis Mapper XML:
if test="customerTag != null">
and (a.customer_tag IS NULL OR a.customer_tag = #{customerTag})
</if>
if test="customerTag != null">
and (a.customer_tag IS NULL OR a.customer_tag = '' OR a.customer_tag = #{customerTag})
</if>
(第二段為修復後的寫法,補上了對空字串的判斷)
這個 BUG 的隱蔽性在於:SQL 語法正確,邏輯上也「看起來」沒問題——只有對比了其他欄位的寫法,才能發現 customer_tag 獨自遺漏了空字串的處理。這類細節差異,人工排查很容易忽略,AI 反而很擅長。
核心思路:用「協議 + 規範」讓 AI 接管固定流程:
這篇文章的本質,是一次對重複性工程勞動的自動化嘗試。除錯的過程——查日誌、提取關鍵資訊、找程式碼、分析原因——邏輯固定、步驟繁瑣,但並不需要太多創造性思維。這類工作恰好是 AI 最擅長接管的。
實現這個閉環,靠的是兩個關鍵組合:
兩者缺一不可。只有 MCP,AI 能查日誌但不知道怎麼系統地分析;只有 Skill,AI 有流程但沒有資料來源。組合起來,才形成了真正可落地的閉環。
值得借鏡的地方:
識別「固定流程」是自動化的起點:不是所有工作都適合 AI 接管,但凡是「步驟固定、資訊來源明確、輸出格式可預期」的工作,都值得嘗試用 Skill + MCP 的方式來自動化。排查 BUG 是一個典型,類似的還有:程式碼審查、效能分析報告生成、告警巡檢等。
Skill 的本質是「給 AI 寫操作手冊」:Skill 檔不是在「訓練模型」,而是在給 AI 一份清晰的 SOP。寫得越細、約束越明確(比如「禁止只查第一頁就下結論」「必須分頁拉完所有資料」),AI 的執行品質越穩定。這和寫給人看的文件本質上是一回事。
AI 擅長發現「橫向比對」類的 BUG:本文的案例揭示了一個有趣的規律:AI 在處理「同類欄位邏輯不一致」這類問題時,表現往往比人工更好。原因在於 AI 沒有「先入為主」的經驗偏見,不會因為「這段程式碼看起來沒問題」就跳過,它會對所有欄位做同等的審查。
最後說一句:AI 時代,工程師的核心競爭力不只是「能寫程式碼」,更是「能把自己的經驗和流程轉化成可重用的 AI 能力」。/log-diagnosis 是一次小小的嘗試,但背後的思路,值得在更多場景裡延伸。
1.Redis 自動化運維最佳實踐|得物技術
2.Claude在得物App數倉的深度整合與效能演進
3.Claude Code + OpenSpec 正在加速 AICoding 落地:從模型博弈到工程化的範式轉移|得物技術
4.大禹平台:流批一體離線Dump平台的設計與應用|得物技術
5.基於 Cursor Agent 的流水線 AI CR 實踐|得物技術
關注得物技術,每週更新技術乾貨
要是覺得文章對你有幫助的話,歡迎評論轉發按讚~
未經得物技術許可嚴禁轉載,否則依法追究法律責任。