運(yùn)行狀態(tài),告別盲調(diào))
1. 移動(dòng)端調(diào)試的困局為什么AI看不見H5的真實(shí)運(yùn)行狀態(tài)做過H5開發(fā)的人大概都有過這種體驗(yàn)頁面在電腦瀏覽器里跑得好好的一放到手機(jī)端就各種詭異問題——接口偶發(fā)失敗、某個(gè)按鈕點(diǎn)了沒反應(yīng)、頁面白屏但控制臺(tái)干干凈凈。你打開手機(jī)上的調(diào)試工具翻半天日志好不容易定位到問題改完代碼重新部署結(jié)果發(fā)現(xiàn)是另一個(gè)問題。整個(gè)過程像在黑暗里摸象效率低得讓人抓狂。傳統(tǒng)的移動(dòng)端調(diào)試方案無非幾種真機(jī)連電腦用遠(yuǎn)程調(diào)試、頁面里嵌入vConsole手動(dòng)看日志、或者干脆在代碼里到處埋console.log然后靠alert彈出來。這些方法各有各的痛點(diǎn)。遠(yuǎn)程調(diào)試需要數(shù)據(jù)線、需要驅(qū)動(dòng)、需要端口轉(zhuǎn)發(fā)換個(gè)手機(jī)或者換個(gè)網(wǎng)絡(luò)環(huán)境就得重新折騰一遍vConsole雖然方便但日志得靠人眼一條條翻請(qǐng)求多了根本看不過來埋點(diǎn)彈窗就更原始了改一次代碼就得重新發(fā)一次包。而這兩年AI編程助手的能力突飛猛進(jìn)很多人已經(jīng)習(xí)慣讓AI幫忙看代碼、分析報(bào)錯(cuò)、給出修復(fù)建議。但這里有個(gè)根本性的斷層AI能看見你的源碼卻看不見你的運(yùn)行時(shí)。你跟AI說我這個(gè)頁面在手機(jī)上請(qǐng)求失敗了AI只能根據(jù)你貼過去的日志片段猜測(cè)它不知道完整的請(qǐng)求鏈路、不知道請(qǐng)求頭里帶了什么、不知道響應(yīng)體長(zhǎng)什么樣、不知道這個(gè)請(qǐng)求是在什么用戶操作之后觸發(fā)的。信息缺失導(dǎo)致AI給出的建議往往是隔靴搔癢。vConsole MCP這個(gè)思路要解決的就是這個(gè)斷層。它做的事情說起來很直接把vConsole采集到的日志和網(wǎng)絡(luò)請(qǐng)求通過MCP協(xié)議暴露出去讓AI助手能夠直接讀取。這樣一來AI就不再是盲人摸象而是能看見H5頁面在真實(shí)設(shè)備上的完整運(yùn)行狀態(tài)。你可以直接問AI剛才那個(gè)登錄請(qǐng)求為什么失敗了AI能自己去讀請(qǐng)求詳情、看響應(yīng)內(nèi)容、結(jié)合源碼給出判斷而不是等你手動(dòng)復(fù)制粘貼一堆信息過去。這篇文章會(huì)從實(shí)際落地角度把vConsole MCP的搭建過程、核心原理、踩坑經(jīng)驗(yàn)完整講一遍。不管你是剛接觸MCP的新手還是已經(jīng)在用AI輔助開發(fā)的老手都能從中找到可以直接復(fù)用的東西。涉及的關(guān)鍵詞包括vConsole、MCP、H5調(diào)試、WebSocket通信、日志采集、請(qǐng)求攔截等下面會(huì)逐一展開。2. 拆解vConsole MCP的通信鏈路從頁面日志到AI可讀數(shù)據(jù)2.1 vConsole本身能拿到什么拿不到什么vConsole是一個(gè)輕量級(jí)的移動(dòng)端調(diào)試面板核心能力是攔截console方法、捕獲window.onerror、代理XMLHttpRequest和fetch把這些信息渲染成一個(gè)浮層面板顯示在頁面上。它能拿到的東西包括console.log/warn/error的輸出、未捕獲的JS異常、網(wǎng)絡(luò)請(qǐng)求的方法/URL/請(qǐng)求頭/請(qǐng)求體/響應(yīng)狀態(tài)/響應(yīng)體/耗時(shí)。但它拿不到的東西也很關(guān)鍵它不知道這些日志之間的因果關(guān)系不知道某個(gè)請(qǐng)求是在哪個(gè)用戶操作之后觸發(fā)的不知道當(dāng)前頁面的路由狀態(tài)和組件樹。而且vConsole的數(shù)據(jù)是存在頁面內(nèi)存里的頁面一刷新就沒了也沒法跨設(shè)備訪問。MCP要做的就是把這些散落在頁面內(nèi)存里的數(shù)據(jù)變成AI可以按需查詢的結(jié)構(gòu)化信息。這里的關(guān)鍵在于按需查詢——不是把所有日志一股腦推給AI而是讓AI能夠像查數(shù)據(jù)庫一樣根據(jù)當(dāng)前調(diào)試的問題去拉取相關(guān)的日志和請(qǐng)求。2.2 MCP協(xié)議在這里扮演什么角色MCP全稱Model Context Protocol是一套讓AI助手能夠訪問外部工具和數(shù)據(jù)源的協(xié)議規(guī)范。你可以把它理解成AI的USB接口——只要某個(gè)服務(wù)實(shí)現(xiàn)了MCP協(xié)議AI就能通過標(biāo)準(zhǔn)化的方式去調(diào)用它。MCP的核心概念包括Resources資源AI可以讀取的數(shù)據(jù)、Tools工具AI可以調(diào)用的函數(shù)、Prompts提示模板。在vConsole MCP這個(gè)場(chǎng)景里vConsole采集到的日志和請(qǐng)求就是ResourcesAI可以通過MCP讀取這些資源。同時(shí)還可以暴露一些Tools比如清空日志、按關(guān)鍵詞過濾請(qǐng)求、獲取某個(gè)請(qǐng)求的完整詳情等讓AI能夠主動(dòng)操作這些數(shù)據(jù)。這里有個(gè)設(shè)計(jì)上的關(guān)鍵選擇數(shù)據(jù)是通過MCP Server中轉(zhuǎn)還是讓AI直接連頁面直接連頁面的話AI需要知道頁面的IP和端口而且頁面關(guān)閉后連接就斷了。通過MCP Server中轉(zhuǎn)的話Server可以維護(hù)一個(gè)日志緩沖區(qū)即使頁面刷新了歷史日志還在。實(shí)際落地時(shí)通常采用后者頁面通過WebSocket把數(shù)據(jù)推給MCP ServerServer再通過MCP協(xié)議暴露給AI。2.3 WebSocket在整條鏈路里的位置頁面和MCP Server之間的通信WebSocket是最自然的選擇。原因有幾個(gè)第一日志和請(qǐng)求是持續(xù)產(chǎn)生的需要服務(wù)端主動(dòng)推送或者客戶端持續(xù)上報(bào)HTTP輪詢延遲高且浪費(fèi)資源第二WebSocket是全雙工的Server可以反向給頁面發(fā)指令比如開始錄制、清空日志第三WebSocket的連接狀態(tài)可以反映頁面是否還活著頁面關(guān)閉時(shí)連接斷開Server能感知到。WebSocket的心跳機(jī)制在這里也很重要。移動(dòng)端網(wǎng)絡(luò)環(huán)境復(fù)雜頁面切到后臺(tái)、網(wǎng)絡(luò)切換、信號(hào)弱等情況都可能導(dǎo)致連接假死。如果不做心跳檢測(cè)Server可能以為頁面還在線實(shí)際上連接早就斷了。常見的做法是客戶端每隔一段時(shí)間發(fā)一個(gè)pingServer回pong連續(xù)幾次沒收到pong就判定連接斷開清理對(duì)應(yīng)的會(huì)話。2.4 數(shù)據(jù)格式的設(shè)計(jì)取舍頁面推給Server的數(shù)據(jù)格式設(shè)計(jì)直接影響后續(xù)AI讀取的效率。如果直接把vConsole的原始數(shù)據(jù)扔過去AI讀起來會(huì)很費(fèi)勁因?yàn)槔锩鎶A雜了大量渲染相關(guān)的字段。更好的做法是在頁面?zhèn)茸鲆粚虞p量清洗只保留調(diào)試真正需要的字段。以網(wǎng)絡(luò)請(qǐng)求為例一條請(qǐng)求記錄至少應(yīng)該包含唯一ID、時(shí)間戳、方法、URL、請(qǐng)求頭、請(qǐng)求體、響應(yīng)狀態(tài)碼、響應(yīng)頭、響應(yīng)體、耗時(shí)、觸發(fā)時(shí)的頁面路由。日志記錄則應(yīng)該包含級(jí)別、時(shí)間戳、參數(shù)序列化后的內(nèi)容、調(diào)用棧如果有。這些字段設(shè)計(jì)得越規(guī)整AI理解起來越容易。注意響應(yīng)體可能非常大直接全量傳輸會(huì)拖慢WebSocket。實(shí)際實(shí)現(xiàn)時(shí)通常會(huì)對(duì)響應(yīng)體做截?cái)啾热绯^一定長(zhǎng)度只保留前N個(gè)字符同時(shí)標(biāo)記已截?cái)?。AI需要完整內(nèi)容時(shí)可以通過單獨(dú)的Tool去請(qǐng)求完整數(shù)據(jù)。3. 從零搭建一套可用的vConsole MCP環(huán)境3.1 環(huán)境準(zhǔn)備與依賴選型搭建這套環(huán)境需要三個(gè)部分頁面?zhèn)鹊牟杉_本、中間的MCP Server、以及AI助手側(cè)的MCP客戶端配置。頁面?zhèn)茸詈?jiǎn)單的方式是直接引入vConsole然后在其基礎(chǔ)上擴(kuò)展一個(gè)WebSocket上報(bào)模塊。如果不想改動(dòng)現(xiàn)有代碼結(jié)構(gòu)也可以寫一個(gè)獨(dú)立的腳本在vConsole初始化之后掛載上報(bào)邏輯。MCP Server可以用Node.js寫因?yàn)镸CP的官方SDK對(duì)Node支持最好而且WebSocket庫ws成熟穩(wěn)定。Server需要同時(shí)監(jiān)聽兩個(gè)端口一個(gè)WebSocket端口給頁面連接一個(gè)MCP端口給AI客戶端連接。這兩個(gè)端口可以復(fù)用同一個(gè)HTTP Server通過路徑區(qū)分。AI助手側(cè)需要配置MCP Server的地址。不同的AI客戶端配置方式不同但核心都是告訴客戶端有一個(gè)MCP Server在某個(gè)地址上去連接它。配置完成后AI就能看到這個(gè)Server暴露的Resources和Tools。3.2 頁面?zhèn)炔杉_本的關(guān)鍵實(shí)現(xiàn)頁面?zhèn)鹊牟杉_本核心是兩件事攔截?cái)?shù)據(jù)、上報(bào)數(shù)據(jù)。攔截?cái)?shù)據(jù)可以直接復(fù)用vConsole的能力也可以通過vConsole的插件機(jī)制來擴(kuò)展。vConsole本身支持插件可以監(jiān)聽它的事件來獲取日志和請(qǐng)求。上報(bào)數(shù)據(jù)時(shí)要注意幾個(gè)細(xì)節(jié)。第一要做批量上報(bào)不能每條日志都發(fā)一次WebSocket消息那樣消息太碎Server處理壓力大。通常的做法是維護(hù)一個(gè)緩沖區(qū)每隔100到200毫秒或者緩沖區(qū)達(dá)到一定條數(shù)時(shí)批量發(fā)送。第二要處理連接斷開的情況斷線后要有重連機(jī)制重連期間產(chǎn)生的數(shù)據(jù)可以先緩存在內(nèi)存里連上之后再補(bǔ)發(fā)。第三要給每條數(shù)據(jù)打上會(huì)話ID這樣Server能區(qū)分不同頁面實(shí)例的數(shù)據(jù)。// 頁面?zhèn)壬蠄?bào)邏輯的簡(jiǎn)化示意 const buffer []; let ws null; let sessionId generateSessionId(); function enqueue(type, payload) { buffer.push({ sessionId, type, payload, timestamp: Date.now() }); } function flush() { if (ws ws.readyState WebSocket.OPEN buffer.length 0) { ws.send(JSON.stringify(buffer.splice(0, buffer.length))); } } setInterval(flush, 150); function connect() { ws new WebSocket(ws://your-server:port/page); ws.onopen () { ws.send(JSON.stringify({ type: register, sessionId })); }; ws.onclose () { setTimeout(connect, 2000); }; }3.3 MCP Server的資源與工具設(shè)計(jì)Server側(cè)要把接收到的數(shù)據(jù)組織成MCP的Resources和Tools。Resources適合放那些AI需要讀取的數(shù)據(jù)比如當(dāng)前會(huì)話的日志列表、當(dāng)前會(huì)話的請(qǐng)求列表、某個(gè)請(qǐng)求的詳情。Tools適合放那些AI需要執(zhí)行的操作比如清空日志、按條件篩選請(qǐng)求、獲取請(qǐng)求的完整響應(yīng)體。資源的設(shè)計(jì)要考慮AI的讀取習(xí)慣。AI通常不會(huì)一次性讀取所有日志而是根據(jù)當(dāng)前問題去讀取相關(guān)部分。所以資源應(yīng)該支持參數(shù)化比如獲取最近N條日志、獲取狀態(tài)碼為500的請(qǐng)求。MCP的Resources支持URI模板可以用類似logs://{sessionId}/recent?count50這樣的形式來定義。工具的設(shè)計(jì)則要考慮操作的原子性。比如清空日志這個(gè)操作應(yīng)該只清空指定會(huì)話的日志而不是所有會(huì)話。再比如獲取請(qǐng)求詳情應(yīng)該接受請(qǐng)求ID作為參數(shù)返回該請(qǐng)求的完整信息。3.4 AI客戶端側(cè)的配置與驗(yàn)證配置AI客戶端連接MCP Server時(shí)最容易出問題的地方是地址和端口。如果Server跑在本地地址通常是localhost或127.0.0.1但如果AI客戶端跑在容器里或者遠(yuǎn)程機(jī)器上就需要用實(shí)際的IP地址。另外要注意防火墻設(shè)置確保MCP端口是開放的。配置完成后可以先讓AI列出當(dāng)前可用的Resources和Tools確認(rèn)連接正常。然后打開一個(gè)測(cè)試頁面觸發(fā)一些日志和請(qǐng)求再讓AI去讀取這些數(shù)據(jù)。如果AI能正確讀到頁面產(chǎn)生的日志說明整條鏈路是通的。提示初次調(diào)試時(shí)建議先用一個(gè)最簡(jiǎn)單的HTML頁面測(cè)試頁面上只放一個(gè)按鈕點(diǎn)擊后產(chǎn)生一條日志和一個(gè)請(qǐng)求。這樣排查問題時(shí)變量最少容易定位是哪一環(huán)出了問題。4. 實(shí)際調(diào)試場(chǎng)景中的效果與邊界4.1 接口偶發(fā)失敗的排查過程接口偶發(fā)失敗是移動(dòng)端最頭疼的問題之一因?yàn)閺?fù)現(xiàn)困難而且失敗時(shí)往往沒有完整的上下文。用vConsole MCP之后排查思路會(huì)發(fā)生變化。你不需要在失敗發(fā)生時(shí)立刻去抓日志而是讓頁面持續(xù)上報(bào)AI在后臺(tái)維護(hù)一個(gè)請(qǐng)求歷史。當(dāng)用戶反饋剛才提交訂單失敗了你可以讓AI去查最近幾分鐘內(nèi)狀態(tài)碼非200的請(qǐng)求。AI拿到請(qǐng)求列表后可以進(jìn)一步查看失敗請(qǐng)求的詳情請(qǐng)求頭里帶了什么token、請(qǐng)求體里的參數(shù)是什么、響應(yīng)體里服務(wù)端返回了什么錯(cuò)誤信息。結(jié)合源碼AI往往能直接給出判斷比如這個(gè)請(qǐng)求的token過期了因?yàn)轫憫?yīng)體里返回了401而且請(qǐng)求頭里的token時(shí)間戳是兩小時(shí)前的。這里的關(guān)鍵在于AI看到的不再是你手動(dòng)篩選后貼過去的信息而是完整的原始數(shù)據(jù)。它能自己決定去看哪些字段、去對(duì)比哪些請(qǐng)求。這種自主性帶來的效率提升是很明顯的。4.2 頁面白屏但無報(bào)錯(cuò)的定位思路頁面白屏但控制臺(tái)沒有報(bào)錯(cuò)這種情況通常是因?yàn)槟硞€(gè)異步操作失敗了但沒有被捕獲或者某個(gè)資源加載失敗但沒有觸發(fā)onerror。用傳統(tǒng)方式排查你得在代碼里到處加日志然后一遍遍刷新看輸出。有了vConsole MCP之后你可以讓AI去分析頁面加載過程中的所有請(qǐng)求。白屏往往伴隨著某個(gè)關(guān)鍵JS文件加載失敗或者某個(gè)接口返回了空數(shù)據(jù)導(dǎo)致渲染邏輯提前返回。AI可以通過對(duì)比正常情況和異常情況下的請(qǐng)求列表快速定位到差異點(diǎn)。比如AI可能會(huì)發(fā)現(xiàn)正常加載時(shí)有一個(gè)獲取用戶信息的請(qǐng)求返回了200但這次這個(gè)請(qǐng)求返回了401導(dǎo)致后續(xù)的渲染邏輯沒有執(zhí)行。這種分析如果靠人眼去翻請(qǐng)求列表可能要翻很久但AI可以瞬間完成對(duì)比。4.3 這套方案的適用邊界與不適用場(chǎng)景vConsole MCP不是萬能的它有明確的適用邊界。首先它依賴于頁面能夠運(yùn)行JavaScript如果頁面在JS執(zhí)行之前就崩潰了比如HTML解析出錯(cuò)那vConsole根本來不及初始化也就采集不到任何數(shù)據(jù)。其次它依賴于網(wǎng)絡(luò)連接如果頁面所在的設(shè)備完全離線數(shù)據(jù)傳不到ServerAI也看不到。另外這套方案對(duì)性能有一定影響。WebSocket連接和頻繁的數(shù)據(jù)上報(bào)會(huì)消耗一定的CPU和電量對(duì)于性能敏感的頁面需要做取舍。通常的做法是在開發(fā)環(huán)境和測(cè)試環(huán)境開啟上報(bào)生產(chǎn)環(huán)境關(guān)閉或者只在需要調(diào)試時(shí)動(dòng)態(tài)開啟。還有一個(gè)容易被忽略的點(diǎn)數(shù)據(jù)隱私。頁面上報(bào)的請(qǐng)求可能包含用戶敏感信息比如token、手機(jī)號(hào)、地址等。如果MCP Server部署在公網(wǎng)這些數(shù)據(jù)就有泄露風(fēng)險(xiǎn)。實(shí)際使用時(shí)應(yīng)該把Server部署在內(nèi)網(wǎng)或者對(duì)敏感字段做脫敏處理。5. 落地過程中容易踩的坑與應(yīng)對(duì)經(jīng)驗(yàn)5.1 WebSocket連接在移動(dòng)端的穩(wěn)定性問題移動(dòng)端WebSocket連接比桌面端脆弱得多。頁面切到后臺(tái)一段時(shí)間后系統(tǒng)可能會(huì)掛起WebSocket連接網(wǎng)絡(luò)從WiFi切到4G時(shí)連接會(huì)斷開甚至某些手機(jī)瀏覽器在鎖屏后直接殺掉連接。如果不處理這些情況你會(huì)發(fā)現(xiàn)日志上報(bào)時(shí)斷時(shí)續(xù)AI讀到的數(shù)據(jù)不完整。應(yīng)對(duì)方案是雙重的客戶端做自動(dòng)重連服務(wù)端做會(huì)話保持??蛻舳嗽趏nclose事件里啟動(dòng)重連定時(shí)器重連成功后把斷線期間緩存的數(shù)據(jù)補(bǔ)發(fā)。服務(wù)端在連接斷開后不立即清理會(huì)話而是保留一段時(shí)間比如5分鐘如果客戶端在這個(gè)時(shí)間內(nèi)重連上來就恢復(fù)到同一個(gè)會(huì)話。心跳機(jī)制也要做但不能太頻繁否則耗電。通常30秒一次ping就夠了連續(xù)3次沒收到pong才判定斷開。這里有個(gè)細(xì)節(jié)頁面切到后臺(tái)時(shí)定時(shí)器可能會(huì)被瀏覽器節(jié)流導(dǎo)致心跳發(fā)不出去。所以心跳檢測(cè)要結(jié)合visibilitychange事件頁面回到前臺(tái)時(shí)立即發(fā)一次心跳確認(rèn)連接狀態(tài)。5.2 大量日志導(dǎo)致的數(shù)據(jù)淹沒頁面跑一段時(shí)間后日志和請(qǐng)求會(huì)積累到幾千條甚至上萬條。如果AI每次都去讀全量數(shù)據(jù)不僅慢而且容易迷失在無關(guān)信息里。這時(shí)候需要在Server側(cè)做數(shù)據(jù)管理。一個(gè)實(shí)用的做法是給日志和請(qǐng)求加上重要性標(biāo)記。console.error和狀態(tài)碼非2xx的請(qǐng)求標(biāo)記為高重要性console.warn和慢請(qǐng)求超過一定耗時(shí)標(biāo)記為中重要性普通的console.log和正常請(qǐng)求標(biāo)記為低重要性。AI查詢時(shí)默認(rèn)只讀高重要性和中重要性的數(shù)據(jù)需要時(shí)再主動(dòng)去讀低重要性的。另一個(gè)做法是支持時(shí)間范圍過濾。AI可以指定只看最近30秒的數(shù)據(jù)這樣即使總數(shù)據(jù)量很大每次讀取的量也是可控的。Server側(cè)維護(hù)一個(gè)環(huán)形緩沖區(qū)只保留最近N條數(shù)據(jù)更早的數(shù)據(jù)自動(dòng)淘汰。5.3 AI讀取數(shù)據(jù)時(shí)的上下文窗口限制AI的上下文窗口是有限的如果一次讀入太多數(shù)據(jù)要么被截?cái)嘁磾D占了其他信息的空間。所以Server返回給AI的數(shù)據(jù)要盡量精簡(jiǎn)。比如請(qǐng)求列表只返回摘要信息方法、URL、狀態(tài)碼、耗時(shí)不返回請(qǐng)求頭和響應(yīng)體AI需要詳情時(shí)再單獨(dú)請(qǐng)求。這里有個(gè)設(shè)計(jì)上的權(quán)衡返回太精簡(jiǎn)AI可能缺少判斷依據(jù)返回太詳細(xì)又浪費(fèi)上下文。實(shí)際經(jīng)驗(yàn)是摘要信息里至少要包含狀態(tài)碼和耗時(shí)因?yàn)檫@兩個(gè)字段最能反映問題。URL要保留完整路徑和查詢參數(shù)因?yàn)閰?shù)往往是問題所在。請(qǐng)求頭和響應(yīng)體則按需獲取。5.4 多頁面多會(huì)話的數(shù)據(jù)隔離一個(gè)調(diào)試場(chǎng)景里可能有多個(gè)頁面同時(shí)運(yùn)行比如主頁面、iframe、WebView里的子頁面。如果這些頁面的數(shù)據(jù)混在一起AI就很難區(qū)分哪條日志來自哪個(gè)頁面。所以會(huì)話隔離是必須的。每個(gè)頁面實(shí)例在初始化時(shí)生成一個(gè)唯一的sessionId上報(bào)數(shù)據(jù)時(shí)帶上這個(gè)ID。Server按sessionId分組存儲(chǔ)數(shù)據(jù)。AI查詢時(shí)可以指定sessionId也可以先列出所有活躍會(huì)話再選擇要查看的會(huì)話。頁面的URL和標(biāo)題也應(yīng)該作為會(huì)話的元信息上報(bào)方便AI識(shí)別。注意iframe和WebView里的頁面可能無法直接訪問父頁面的WebSocket連接需要各自建立獨(dú)立的連接。這種情況下Server要能處理多個(gè)連接對(duì)應(yīng)同一個(gè)邏輯會(huì)話的情況或者把它們視為不同的會(huì)話但在元信息里標(biāo)注關(guān)聯(lián)關(guān)系。6. 讓AI真正用起來查詢策略與協(xié)作技巧6.1 怎么問AI才能讓它高效利用這些數(shù)據(jù)有了數(shù)據(jù)通道之后提問方式直接決定了AI的排查效率。如果你只是籠統(tǒng)地說幫我看看有什么問題AI可能會(huì)漫無目的地翻數(shù)據(jù)。更好的方式是給出明確的線索和范圍比如最近一分鐘內(nèi)狀態(tài)碼為500的請(qǐng)求有哪些、用戶點(diǎn)擊提交按鈕之后產(chǎn)生了哪些日志。另一個(gè)技巧是讓AI做對(duì)比分析。比如對(duì)比一下成功提交和失敗提交的請(qǐng)求差異AI會(huì)自動(dòng)去拉取兩組請(qǐng)求的數(shù)據(jù)找出不同點(diǎn)。這種對(duì)比如果靠人來做需要手動(dòng)篩選、逐字段比對(duì)很費(fèi)時(shí)間但AI可以很快完成。還可以讓AI做時(shí)間線重建。告訴AI一個(gè)用戶操作序列讓它按時(shí)間順序把相關(guān)的日志和請(qǐng)求串起來形成一個(gè)完整的執(zhí)行鏈路。這對(duì)于理解復(fù)雜交互場(chǎng)景下的問題特別有用。6.2 把常見排查流程固化成提示模板MCP協(xié)議支持Prompts可以把常見的排查流程固化成模板。比如接口失敗排查模板會(huì)自動(dòng)引導(dǎo)AI去查最近的失敗請(qǐng)求、讀取請(qǐng)求詳情、對(duì)比成功請(qǐng)求、給出可能原因。這樣每次遇到類似問題不需要重新描述排查思路直接調(diào)用模板就行。模板的設(shè)計(jì)要結(jié)合團(tuán)隊(duì)的實(shí)際排查習(xí)慣。比如你們團(tuán)隊(duì)排查接口問題時(shí)習(xí)慣先看狀態(tài)碼、再看響應(yīng)體、最后看請(qǐng)求頭那模板就按這個(gè)順序來。模板里還可以預(yù)置一些常見的錯(cuò)誤模式比如401通常是token問題、502通常是網(wǎng)關(guān)問題幫助AI更快定位。6.3 和現(xiàn)有開發(fā)流程的銜接方式vConsole MCP不應(yīng)該是一個(gè)孤立的工具最好能融入現(xiàn)有的開發(fā)流程。比如在CI流程里可以在自動(dòng)化測(cè)試跑完之后讓AI去讀取測(cè)試過程中的日志和請(qǐng)求自動(dòng)生成一份問題報(bào)告。又比如在代碼審查時(shí)可以讓AI結(jié)合運(yùn)行時(shí)的請(qǐng)求數(shù)據(jù)來評(píng)估代碼改動(dòng)的影響。對(duì)于測(cè)試同學(xué)來說這套方案也很有價(jià)值。測(cè)試發(fā)現(xiàn)bug時(shí)不需要再手動(dòng)整理日志和請(qǐng)求信息直接讓AI去讀取對(duì)應(yīng)會(huì)話的數(shù)據(jù)自動(dòng)生成bug報(bào)告。報(bào)告里包含完整的請(qǐng)求鏈路和錯(cuò)誤日志開發(fā)拿到后能更快定位問題。6.4 數(shù)據(jù)留存與回放的價(jià)值頁面關(guān)閉后數(shù)據(jù)如果直接丟棄就失去了回溯的可能。Server側(cè)應(yīng)該把會(huì)話數(shù)據(jù)持久化一段時(shí)間比如保留24小時(shí)。這樣即使問題發(fā)生在一段時(shí)間之前只要還在保留期內(nèi)就能讓AI去讀取歷史數(shù)據(jù)。更進(jìn)一步可以把會(huì)話數(shù)據(jù)做成可回放的。回放的意思是把某個(gè)時(shí)間段的日志和請(qǐng)求按時(shí)間順序重新播放出來模擬當(dāng)時(shí)的運(yùn)行狀態(tài)。這對(duì)于復(fù)現(xiàn)偶發(fā)問題特別有用因?yàn)槟憧梢宰孉I在回放過程中去分析每一步的狀態(tài)變化。持久化時(shí)要注意數(shù)據(jù)量全量存儲(chǔ)可能占用大量磁盤。通常的做法是只持久化高重要性和中重要性的數(shù)據(jù)低重要性的數(shù)據(jù)在會(huì)話結(jié)束后就丟棄。同時(shí)要設(shè)置過期清理策略避免磁盤被占滿。7. 我對(duì)這套方案的實(shí)際體會(huì)用了一段時(shí)間vConsole MCP之后最大的感受是調(diào)試的信息不對(duì)稱被大幅削弱了。以前跟AI描述問題時(shí)總擔(dān)心自己漏掉了關(guān)鍵信息導(dǎo)致AI給出錯(cuò)誤判斷?,F(xiàn)在AI能自己去看原始數(shù)據(jù)我只需要告訴它去看哪個(gè)會(huì)話、關(guān)注哪個(gè)時(shí)間段剩下的它自己會(huì)搞定。另一個(gè)體會(huì)是這套方案的價(jià)值不僅在于讓AI看見更在于讓AI記住。人看日志是瞬時(shí)的看完就忘了但AI可以把整個(gè)會(huì)話的數(shù)據(jù)都保持在上下文里隨時(shí)回溯。排查復(fù)雜問題時(shí)這種全局視角特別有用。當(dāng)然也有不完美的地方。WebSocket在移動(dòng)端的穩(wěn)定性仍然是個(gè)挑戰(zhàn)偶爾還是會(huì)出現(xiàn)數(shù)據(jù)丟失。另外AI讀取大量數(shù)據(jù)時(shí)的上下文管理也需要優(yōu)化有時(shí)候它會(huì)在無關(guān)的日志上浪費(fèi)注意力。這些都是后續(xù)可以繼續(xù)改進(jìn)的方向。如果你也在做H5開發(fā)并且已經(jīng)在用AI輔助編程我建議試試這套方案。搭建成本不高但帶來的效率提升是實(shí)實(shí)在在的。尤其是排查那些偶發(fā)、難復(fù)現(xiàn)的問題時(shí)有一個(gè)能看見完整運(yùn)行時(shí)的AI助手體驗(yàn)完全不一樣。