Skip to content

feat(logging): 接入宿主统一日志 litheLogging 1(Rust SDK 0.2.0) - #4

Merged
xiaoyumuxi merged 3 commits into
mainfrom
feat/plugin-logging-v1
Nov 5, 2026
Merged

xiaoyumuxi merged 3 commits into
mainfrom
feat/plugin-logging-v1

Conversation

@xiaoyumuxi

Copy link
Copy Markdown
Contributor

背景

主仓库的插件日志已统一到宿主的 litheLogging 1,Rust SDK 0.2.0 删除了自由文本的 Context::log,并改为自动上报每个函数的终态事实。本 PR 把 Java 插件后端接到这套日志上,不再写 stderr,日志里只有受限字段(类别、计数、耗时、操作 ID),不含路径、源码、工具输出或宿主消息。

改动

1. SDK 升级到 0.2.0

  • sdk.lock.json、backend/Cargo.toml 固定到 sdk-rust-v0.2.0(commit 940394fc),Cargo.lock 同步(新增 base64)。
  • SDK 0.2.0 在宿主不提供 litheLogging 1 时拒绝 initialize。

2. 后端的级别规则(backend/src/lib.rs)

事实 级别 来源 内容
关键操作成功:runConfig.selectJava、debug.javaTestLaunch、execution.planLaunchCommand、java.prepareLaunch(KEY_OPERATIONS) INFO SDK 自动 操作 ID、耗时
其余函数成功(编辑器驱动或启动时的读取,如 java.runMarkers、java.codeVision、spring.index) 不记录 suppress_success_diagnostics —
任一函数失败 ERROR SDK 自动 类别为 pluginErrorCode、耗时;不含消息与 details
取消 不记录 SDK —
languageImport.settings 的中转降级(列提供方失败、单个提供方失败或超时、答复不可用、答复含越界键) WARN(degraded) backend/src/plugin_functions.rs relay.* 类别与计数;不含提供方 ID 和键名
插件存储清理失败 WARN(degraded) crates/java-domain/src/host/diagnostics.rs storage.cleanup_failed.<阶段> 与计数
JDT LS 自身日志 上游,默认 WARNING plugin.json 的 -Dosgi.logfile=${logDir}/jdt.log 只写宿主提供的会话日志目录
  • 失败不再由后端自己写日志:function_error 只做 CoreError → FunctionError 的映射,终态事实由 SDK 在 RPC 响应之前写出。
  • 抑制必须在注册之后调用,所以放在注册循环之后;新测试 key_operations_are_registered_commands_without_duplicates 保证 KEY_OPERATIONS 都是已注册的命令且不重复。

3. 领域层的降级上报(crates/java-domain/src/host/diagnostics.rs,新文件)

  • 领域 crate 不依赖 SDK。新增线程局部 reporter:scoped(reporter, body) 在一次调用里安装,Drop 时恢复之前的 reporter;degraded(code, count)、cleanup_failed(stage, count) 在没有 reporter 时什么也不做。
  • 后端在 invoke 里用 scoped 把 reporter 接到 context.diagnostics().degraded(...)。
  • host/storage.rs:清理失败只累计次数,finish 时按阶段上报一次计数,不再保存第一条错误。
  • execution/argfile.rs:argfile 删除失败上报 storage.cleanup_failed.java-argfile-remove。

4. 中转降级类别(backend/src/plugin_functions.rs)

  • 新增 RELAY_PROVIDERS_UNAVAILABLE、RELAY_PROVIDER_FAILED、RELAY_PROVIDER_TIMED_OUT、RELAY_SETTINGS_REJECTED、RELAY_KEYS_REJECTED 和 RELAY_CATEGORIES。
  • collect_contributions 和 record_answer 接收上报回调,collect_for_call 用调用上下文的 diagnostics() 上报。
  • 顶部 TODO 改为描述已合入的 #1742 的真实形状,并说明对齐要等支持插件函数协议 4 的 SDK。

5. 入口不写 stderr(backend/src/main.rs)

  • 注册函数只是填 SDK 的内存表,在宿主 initialize 之前不发任何消息;函数 ID 全是编译期常量,只会因 ID 不合法、重复或超过 SDK 上限而失败,结果每次都一样。
  • 测试 the_backend_builds_with_every_command_registered(原 every_command_is_a_valid_function_id)断言构建成功,CI 挡住这类构建;main 的失败分支不再打印,直接以状态 1 退出,由宿主记录启动失败。
  • 没有把注册挪进 on_initialize:SDK 0.2.0 的 Initialize 钩子没有 suppress_success_diagnostics,挪过去以后编辑器高频读取每次都会记 INFO。

6. 测试

  • backend/tests/session.rs:initialize 带上 litheLogging 1,并断言协商结果;新测试 the_backend_reports_restricted_facts_and_suppresses_reads 检查日志参数只有受限字段、只读函数的成功被抑制、失败按 pluginErrorCode 上报;新测试 initialize_without_lithe_logging_is_refused。
  • host/diagnostics.rs 8 个测试;plugin_functions.rs 新增 6 个 relay 上报测试,原测试改名为 rejected_keys_are_reported_by_count_and_never_stored。

7. 文档

  • README.md:新增“日志”一节和上面的级别表;预发布原因改为三条,第 3 条是 SDK 0.2.0 要求 litheLogging 1。
  • .github/workflows/release.yml:只改注释(预发布原因三条)。
  • MIGRATION.md:日志行改为已移植;测试计数更新为 312(领域 280、后端 32);写明 #1742 已合入、本仓库中转形状仍是草稿,第 5.7 节改为“草稿与已合入形状的差异”对照表,清单声明补上 serverProcess: 1。

有意推迟

  • 中转形状对齐、languageImport.settingsChanged 注册:要等支持插件函数协议 4 的 SDK(caller 字段、parentOperationID)。
  • 真实宿主验收:plugin.json 还没有声明 backend,宿主暂时不会启动这个后端;声明之后再在 Lithe 里实测日志。
  • Release 仍是预发布:SDK 0.2.0 需要 litheLogging 1,目前只有 Lithe 最新 preview 提供,稳定版还没有。

验证

  • cargo fmt --all --check:无改动。
  • cargo clippy --locked --all-targets -- -D warnings:通过。
  • cargo test --locked:全部通过,领域 280、后端单元 23、repository_pins 6、session 3。
  • scripts/verify-sdk-lock.sh --download:通过,SDK 归档的 SHA-256 与 sdk.lock.json 一致。

- SDK 固定到 lithe-plugin-sdk-rust 0.2.0(sdk.lock.json、backend/Cargo.toml、Cargo.lock);
  宿主不提供 litheLogging 1 时 SDK 拒绝 initialize。
- 终态事实交给 SDK 自动上报:成功 operationFinished(INFO),失败 operationFailed(ERROR,
  code 为 pluginErrorCode)。只有 KEY_OPERATIONS 里的四个关键操作上报成功事实,其余只读函数
  注册后用 suppress_success_diagnostics 关闭成功事实。
- 新增 java-domain host::diagnostics:领域代码通过线程局部 reporter 上报降级类别与计数,
  不依赖 SDK;后端在每次调用里用 scoped 接到 Diagnostics::degraded。
- 存储清理失败、argfile 删除失败改为上报 storage.cleanup_failed.<stage> 计数,不再写路径或消息。
- 跨插件函数的收集上报 relay.* 降级类别(提供方不可用、失败、超时、设置被拒、键被拒),
  只带计数,不带键名或宿主消息。
- 删除旧的 Context::log 调用;main.rs 注册失败只打印稳定错误码。
- 测试:session 集成测试验证 litheLogging 协商、受限日志字段、只读函数的成功事实被关闭,
  以及缺少 litheLogging 时 initialize 被拒;领域与后端新增 diagnostics、relay 上报测试。
- 文档:README 新增“日志”一节和级别表;预发布原因加入 litheLogging 1;MIGRATION 更新测试计数,
  说明 #1742 已合入、中转形状要等支持插件函数协议 4 的 SDK 再对齐。
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review November 5, 2026 07:25
@xiaoyumuxi
xiaoyumuxi merged commit fdec0bb into main Nov 5, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant