態(tài)調(diào)整服務(wù)端追蹤級(jí)別的完整指南)
開發(fā)工具【免費(fèi)下載鏈接】language-server-protocolDefines a common protocol for language servers.項(xiàng)目地址https://gitcode.com/gh_mirrors/la/language-server-protocol點(diǎn)擊查看免費(fèi)下載$/setTrace是 Language Server ProtocolLSP中一條由客戶端編輯器/IDE發(fā)往服務(wù)端語(yǔ)言服務(wù)器的通知用于在運(yùn)行時(shí)動(dòng)態(tài)修改服務(wù)器的 trace追蹤設(shè)置從而精確控制服務(wù)端通過(guò)$/logTrace通知上報(bào)執(zhí)行軌跡的詳細(xì)程度。本文以倉(cāng)庫(kù)中 setTrace 規(guī)范文檔 為主體結(jié)合 TraceValue 類型定義、initialize 請(qǐng)求 與 3.17 版 metaModel.json 元數(shù)據(jù)系統(tǒng)講解該通知的協(xié)議定義、參數(shù)結(jié)構(gòu)、取值語(yǔ)義、與$/logTrace的聯(lián)動(dòng)關(guān)系以及在實(shí)際語(yǔ)言客戶端與服務(wù)端中的落地要點(diǎn)幫助你完整掌握 LSP 運(yùn)行時(shí)追蹤的配置機(jī)制。一、為什么需要$/setTrace從初始化到運(yùn)行時(shí)的追蹤級(jí)別控制在 LSP 中語(yǔ)言服務(wù)器的執(zhí)行軌跡trace上報(bào)能力并非一成不變。追蹤級(jí)別最初由客戶端在發(fā)送initialize請(qǐng)求時(shí)通過(guò)InitializeParams.trace字段設(shè)定但語(yǔ)言服務(wù)器是長(zhǎng)期運(yùn)行的進(jìn)程用戶可能隨時(shí)需要開啟或關(guān)閉調(diào)試信息此時(shí)不可能重啟服務(wù)器重新握手。$/setTrace通知正是為解決這個(gè)問(wèn)題而設(shè)計(jì)客戶端可以在會(huì)話進(jìn)行中的任意時(shí)刻通過(guò)一條輕量級(jí)通知修改服務(wù)端的 trace 設(shè)置無(wú)需重啟語(yǔ)言服務(wù)器也無(wú)需重新初始化。規(guī)范原文明確指出A notification that should be used by the client to modify the trace setting of the server.這條通知屬于 LSP 的基礎(chǔ)協(xié)議base protocol消息與$/cancelRequest、$/progress等一樣以$前綴標(biāo)識(shí)其為通用基礎(chǔ)設(shè)施消息而非針對(duì)某個(gè)具體語(yǔ)言特性如補(bǔ)全、跳轉(zhuǎn)定義的功能消息。二、協(xié)議定義與參數(shù)結(jié)構(gòu)2.1 通知Notification形態(tài)$/setTrace是一條單向通知notification方向?yàn)榭蛻舳说椒?wù)端client → servermethod方法名$/setTraceparams參數(shù)SetTraceParams返回?zé)o通知不產(chǎn)生響應(yīng)metaModel 中對(duì)其的登記也印證了這一方向與結(jié)構(gòu)metaModel.json 第 21142120 行{ method: $/setTrace, messageDirection: clientToServer, params: { kind: reference, name: SetTraceParams } }2.2SetTraceParams類型規(guī)范給出的SetTraceParams定義極其精簡(jiǎn)只有一個(gè)必填字段interface SetTraceParams { /** * The new value that should be assigned to the trace setting. */ value: TraceValue; }valueTraceValue類型表示要賦給服務(wù)端 trace 設(shè)置的新值。該字段必填且只能取TraceValue枚舉中的三個(gè)合法字符串之一。metaModel 中對(duì)應(yīng)的結(jié)構(gòu)化定義metaModel.json 第 63956405 行確認(rèn)該結(jié)構(gòu)僅含value一個(gè)屬性其類型引用TraceValues枚舉{ name: SetTraceParams, properties: [ { name: value, type: { kind: reference, name: TraceValues } } ] }2.3TraceValue三種追蹤級(jí)別TraceValue定義在 traceValue.md 中export type TraceValue off | messages | verbose;三種取值的語(yǔ)義如下metaModel 中 TraceValues 枚舉 第 1382413846 行給出了權(quán)威說(shuō)明取值說(shuō)明對(duì)$/logTrace上報(bào)的影響off關(guān)閉追蹤Turn tracing off服務(wù)端不應(yīng)發(fā)送任何$/logTrace通知messages僅追蹤消息Trace messages only服務(wù)端應(yīng)發(fā)送$/logTrace但不得攜帶verbose字段verbose詳細(xì)消息追蹤Verbose message tracing服務(wù)端應(yīng)發(fā)送$/logTrace并可在參數(shù)中附帶verbose詳細(xì)信息{ name: TraceValues, type: { kind: base, name: string }, values: [ { name: Off, value: off, documentation: Turn tracing off. }, { name: Messages, value: messages, documentation: Trace messages only. }, { name: Verbose, value: verbose, documentation: Verbose message tracing. } ] }2.4 追蹤的初始值InitializeParams.trace$/setTrace修改的正是初始化時(shí)確立的同一份 trace 設(shè)置。在 initialize 請(qǐng)求 中InitializeParams攜帶了初始追蹤值interface InitializeParams extends WorkDoneProgressParams { // ... /** * The initial trace setting. If omitted trace is disabled (off). */ trace?: TraceValue; // ... }關(guān)鍵點(diǎn)trace為可選字段省略時(shí)默認(rèn)為off追蹤關(guān)閉因此$/setTrace通常用于將默認(rèn)關(guān)閉的追蹤動(dòng)態(tài)打開例如排障時(shí)切到verbose或在使用完畢后降級(jí)回off/messages以降低性能開銷初始化階段與服務(wù)端協(xié)商了初始級(jí)別運(yùn)行階段則由$/setTrace接管后續(xù)調(diào)整兩者共用同一TraceValue枚舉語(yǔ)義完全一致。三、$/setTrace與$/logTrace的聯(lián)動(dòng)追蹤數(shù)據(jù)的產(chǎn)生與消費(fèi)$/setTrace本身不傳輸任何追蹤數(shù)據(jù)它只是開關(guān)和旋鈕真正的追蹤數(shù)據(jù)由$/logTrace通知承載。二者構(gòu)成一對(duì)典型的客戶端配置 → 服務(wù)端上報(bào)閉環(huán)方向恰好相反$/setTraceclient → server修改服務(wù)端的 trace 級(jí)別$/logTraceserver → client按當(dāng)前 trace 級(jí)別上報(bào)執(zhí)行軌跡。$/logTrace見(jiàn) logTrace.md的參數(shù)結(jié)構(gòu)為interface LogTraceParams { /** * The message to be logged. */ message: string; /** * Additional information that can be computed if the trace configuration * is set to verbose */ verbose?: string; }規(guī)范明確了$/logTrace上報(bào)量與當(dāng)前 trace 配置的嚴(yán)格對(duì)應(yīng)關(guān)系trace off服務(wù)端不應(yīng)發(fā)送任何$/logTrace通知trace messages服務(wù)端發(fā)送$/logTrace但LogTraceParams.verbose字段必須省略不得添加trace verbose服務(wù)端發(fā)送$/logTrace且允許鼓勵(lì)計(jì)算并填充verbose字段提供超出message的附加細(xì)節(jié)。metaModel 對(duì)LogTraceParams的結(jié)構(gòu)化描述metaModel.json 第 64066424 行同樣標(biāo)注了verbose為可選optional: true與規(guī)范一致{ name: LogTraceParams, properties: [ { name: message, type: { kind: base, name: string } }, { name: verbose, type: { kind: base, name: string }, optional: true } ] }此外規(guī)范還強(qiáng)調(diào)了一條使用邊界$/logTrace僅用于系統(tǒng)性的軌跡上報(bào)對(duì)于零散的、一次性的調(diào)試消息服務(wù)端應(yīng)改用window/logMessage通知避免把日志通道與追蹤通道混為一談。四、實(shí)戰(zhàn)應(yīng)用一次完整的動(dòng)態(tài)調(diào)追蹤流程綜合上述協(xié)議定義客戶端動(dòng)態(tài)調(diào)整服務(wù)端追蹤級(jí)別的完整鏈路如下初始化協(xié)商客戶端發(fā)送initialize請(qǐng)求在InitializeParams.trace中給出初始級(jí)別如省略則服務(wù)端按off處理動(dòng)態(tài)調(diào)整會(huì)話運(yùn)行期間當(dāng)用戶需要排障時(shí)客戶端向服務(wù)端發(fā)送{ jsonrpc: 2.0, method: $/setTrace, params: { value: verbose } }一條完整的 LSP 通知報(bào)文示例jsonrpc固定為2.0通知無(wú)id字段服務(wù)端不返回響應(yīng)。服務(wù)端響應(yīng)上報(bào)服務(wù)端收到后將內(nèi)部 trace 設(shè)置更新為verbose隨后按新級(jí)別發(fā)送$/logTrace通知例如{ jsonrpc: 2.0, method: $/logTrace, params: { message: Processing textDocument/hover request, verbose: request: textDocument/hover at position 1:10, document: file:///workspace/src/main.ts } }降級(jí)恢復(fù)排障結(jié)束后客戶端發(fā)送{ value: off }或{ value: messages }關(guān)閉或收斂追蹤減少不必要的通信開銷。五、服務(wù)端實(shí)現(xiàn)要點(diǎn)與注意事項(xiàng)從服務(wù)端實(shí)現(xiàn)角度看處理$/setTrace有以下實(shí)踐要點(diǎn)實(shí)現(xiàn)方式收到$/setTrace后將內(nèi)部追蹤狀態(tài)更新為參數(shù)value對(duì)應(yīng)的枚舉值即可通常映射到日志框架的日志級(jí)別由于是通知處理過(guò)程不應(yīng)拋錯(cuò)返回通知無(wú)響應(yīng)通道但要保證狀態(tài)變更對(duì)后續(xù)$/logTrace的過(guò)濾邏輯立即生效過(guò)濾邏輯$/logTrace的發(fā)送邏輯必須嚴(yán)格遵循規(guī)范——off時(shí)不發(fā)送、messages時(shí)不帶verbose、verbose時(shí)才計(jì)算verbose字段避免過(guò)度發(fā)送導(dǎo)致客戶端日志刷屏通道職責(zé)分離系統(tǒng)性的執(zhí)行軌跡走$/logTrace單獨(dú)的調(diào)試/錯(cuò)誤信息走window/logMessage二者互補(bǔ)而非替代初始值兜底即使客戶端從未發(fā)送過(guò)$/setTrace服務(wù)端也應(yīng)能依據(jù)initialize請(qǐng)求中的trace缺失時(shí)視為off正確工作保證$/setTrace只是錦上添花的動(dòng)態(tài)能力而非前置依賴。六、版本與配套資料$/setTrace自 LSP 早期版本base protocol沿用至今在倉(cāng)庫(kù)的 3.17、3.18、3.19 三份規(guī)范中均有對(duì)應(yīng)文檔見(jiàn) _includes/messages/3.17/setTrace.md、_includes/messages/3.18/setTrace.md 等協(xié)議定義保持一致。如需深入掌握相關(guān)主題倉(cāng)庫(kù)內(nèi)可直接研讀TraceValue 類型定義追蹤級(jí)別枚舉及初始值語(yǔ)義LogTrace 通知規(guī)范追蹤數(shù)據(jù)上報(bào)通道與字段約束Initialize 請(qǐng)求規(guī)范初始追蹤值的設(shè)置與默認(rèn)值說(shuō)明3.17 完整規(guī)范將本通知置于完整協(xié)議上下文中閱讀第 479 行處引入 setTrace 小節(jié)metaModel.json機(jī)器可讀的結(jié)構(gòu)化元數(shù)據(jù)包含$/setTrace消息、SetTraceParams結(jié)構(gòu)與TraceValues枚舉的精確定義可用于代碼生成與協(xié)議校驗(yàn)。小結(jié)$/setTrace用最精簡(jiǎn)的參數(shù)結(jié)構(gòu)一個(gè)value字段、三個(gè)枚舉取值實(shí)現(xiàn)了語(yǔ)言服務(wù)器運(yùn)行期追蹤級(jí)別的動(dòng)態(tài)調(diào)控初始化時(shí)由InitializeParams.trace設(shè)定初值默認(rèn)off運(yùn)行中由$/setTrace隨時(shí)改寫服務(wù)端再依據(jù)當(dāng)前級(jí)別通過(guò)$/logTrace按off/messages/verbose三檔精確控制執(zhí)行軌跡的上報(bào)內(nèi)容與詳細(xì)程度。理解并正確實(shí)現(xiàn)這一對(duì)通知是語(yǔ)言服務(wù)器調(diào)試體驗(yàn)與日志治理的關(guān)鍵一環(huán)。贊分享開發(fā)工具【免費(fèi)下載鏈接】language-server-protocolDefines a common protocol for language servers.項(xiàng)目地址https://gitcode.com/gh_mirrors/la/language-server-protocol點(diǎn)擊查看免費(fèi)下載相關(guān)推薦language-server-protocol 3.17 之 workspace/applyEdit服務(wù)器驅(qū)動(dòng)客戶端執(zhí)行 WorkspaceEdit 的完整協(xié)議指南language server protocol 3.17 之 workspace/applyEdit服務(wù)器驅(qū)動(dòng)客戶端執(zhí)行 WorkspaceEdit 的完整開發(fā)工具使用 RouterSploit 復(fù)現(xiàn) Cisco RV320 命令注入漏洞CVE-2019-1652證書生成器遠(yuǎn)程命令執(zhí)行實(shí)戰(zhàn)使用 RouterSploit 復(fù)現(xiàn) Cisco RV320 命令注入漏洞CVE 2019 1652證書生成器遠(yuǎn)程命令執(zhí)行實(shí)戰(zhàn) 本文以 RouterSpl開發(fā)工具書轉(zhuǎn) Skill 到底值不值book-to-skill 深度解析——把整書塞進(jìn)上下文之前先算這筆賬書轉(zhuǎn) Skill 到底值不值book to skill 深度解析——把整書塞進(jìn)上下文之前先算這筆賬 你手頭有一本 400 頁(yè)的技術(shù)書想讓 AI 助手在寫代開發(fā)工具上一篇【親測(cè)免費(fèi)】 推薦Bootstrap Tree View - 極簡(jiǎn)優(yōu)雅的樹形視圖組件下一篇【親測(cè)免費(fèi)】 推薦開源項(xiàng)目AngularJS UI Select —— 搜索選擇器的完美升級(jí)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考