跳到主要内容

日志和用户报障怎么排查?

结论​

插件自己写 LogOutputChannel,让用户能打开对应输出通道。报障时同时要扩展宿主日志、插件日志,以及出问题一侧是本地还是远程。能复现再看激活耗时和开发者工具。

展开​

const log = vscode.window.createOutputChannel("我的插件", { log: true });
context.subscriptions.push(log);
log.info("服务器已启动");
log.error("初始化失败", error);

带 log: true 的通道有级别,用户可以用命令调高到 Trace。Trace 里可以打协议摘要,但默认级别不要刷屏,也不要打令牌、完整文件内容。

排障时让用户提供:

  • 编辑器版本、插件版本、操作系统
  • 是本地、SSH、容器还是网页
  • 输出通道「我的插件」
  • 「开发人员:打开扩展日志文件夹」里的宿主日志
  • 语言服务器如果单独有通道,一并导出

看日志的顺序:插件有没有激活,激活事件是什么,失败发生在启动进程、握手还是某次请求。远程时远端宿主日志和本地 UI 日志是分开的,Webview 空白要看渲染进程的开发者工具控制台,那里能看到内容安全策略和资源 404。

开发时可以开语言客户端的 trace。正式版默认关闭。

不要只靠 showErrorMessage 排障。通知一闪而过,没有堆栈。通知给用户一句人话,详细原因进日志。

容易讲错的点​

  • console.log 会进宿主日志,但不该当产品日志。用户找不到一个固定通道,发布包里也会很吵。
  • 输出通道不释放,重载后会叠成好几个同名通道。
  • 把用户文件内容整段打进日志再让他上传,会泄露源码。记录 URI、版本和错误码即可。