Effect 深度课effect@4.1.4 · LTS
错误与诊断

L12 可观测性:日志、追踪与失败报告

⏱ 25 min难度 2/5前置:L11
本课目标
  • 知道上下文如何在 fiber 内传播
  • 能配置局部 logger 并格式化 Cause
前置课时尚未完成:L11

可以自行跳转学习,但按顺序推进会更省力;学情分析会把这类缺口归入「前置缺口」。

上下文跟着 fiber 走

日志注解、当前 span、堆栈信息是 fiber 局部状态,由 Context.Reference 一类的引用在 fiber 内传播:子 fiber 继承父 fiber 的配置,退出局部作用域后自动还原。因此并发任务里的日志天然带着正确上下文,不需要手动透传。

局部替换 logger 与格式化失败
← 代码可左右滑动 →
import { Cause, Effect, Logger } from "effect"

const simple = Logger.layer([
  Logger.make(({ message }) => console.log(message))
])

const program = Effect.gen(function* () {
  yield* Effect.log("start")
  yield* Effect.log("nested").pipe(Effect.provide(simple))
  yield* Effect.log("back to default")
})

// 边界处统一输出完整失败报告
const report = (cause: Cause.Cause<unknown>) =>
  Effect.log(Cause.pretty(cause))
💡 Effect.provide 可以只作用于一段嵌套 workflow,离开后配置恢复原状。
💡 preferentially 用 Cause.pretty

Cause.pretty 会把多个 reason、堆栈与中断来源排版成可读报告,比 console.log(error) 更适合生产排障。配合 Cause.annotate 还能给失败附加结构化元数据。

关键术语
Context.Reference
v4 中承载 fiber 局部配置与状态的引用类型
span
一次有起止与父子关系的追踪单元
常见误区
× 在并发任务里用模块级变量记录请求 ID,导致日志串线。
随堂测验(即时反馈,答题计入掌握度)
Q1fiber 局部的日志/追踪配置如何传给子 fiber?
Q2输出完整 Cause 报告用?