Expand description
进程内日志捕获 Layer(server-only)。
作为 tracing_subscriber::Layer 挂进 registry(见 main.rs),把全部 target
的日志事件复制一份送进两条无锁通道:
mpsc(容量 4096):crate::tasks::log_writer攒批后批量 INSERT 进 logs 表;broadcast(容量 1024):super::sse的实时流订阅,按连接参数过滤后推送。
关键性质:
- 绝不阻塞日志路径:两条通道都用非阻塞发送。mpsc 满了只累加 dropped
计数;broadcast 满了最旧事件被覆盖,接收端走
Lagged→gap事件。 - 防递归:
yggdrasil::api::logs与yggdrasil::tasks::log_writer前缀的 target 直接跳过——写库失败的 error 日志不能再进管道,否则 「写库失败 → 记日志 → 再写库 → 再失败」会自我放大。 - 独立过滤:Layer 在 main.rs 里以 per-layer
EnvFilter包裹 (log_viewer_filter,读LOG_VIEWER_LEVEL,默认 info,不吃 RUST_LOG)。 注意tracing依赖带release_max_level_info:release 构建中 DEBUG/TRACE 在编译期即被剔除,env 调到 debug 也只有 info+。
Structs§
- Capture
Layer - 日志捕获 Layer。在 main.rs 里以
.with_filter(log_viewer_filter())包裹后 挂进 registry;本体的enabled恒 true,级别过滤全部交给 per-layer filter。 泛型实现(非特化 Registry):registry().with(fmt).with(capture) 组合时, 外层 S 是 Layered<…> 而非裸 Registry,特化实现会导致 Layered 不再满足Into<Dispatch>。 - LogChannels 🔒
- 进程级日志通道枢纽。
- LogRecord
- 内部捕获记录(writer 落库与 SSE 实时流共用的最小表示,非 serde DTO)。
- Message
Visitor 🔒 - 事件字段提取:message 单独存,其余字段按声明顺序收集。
Constants§
- BROADCAST_
CAP 🔒 - 实时流通道容量:SSE 客户端消费慢时最旧事件被覆盖(接收端收 Lagged)。
- EXCLUDED_
TARGETS 🔒 - 防递归 target 前缀:日志管道自身的日志不再进管道。
- MAX_
MESSAGE_ 🔒BYTES - 单条消息上限(字节):防止异常大日志撑爆内存与表行。
- MPSC_
CAP 🔒 - 落库通道容量:writer 未启动(迁移窗口)或 DB 短暂不可达时的缓冲。 满了按条计入 dropped,绝不阻塞打日志的线程。
Statics§
- CHANNELS 🔒
- 全局通道实例(LazyLock:Layer 是 ’static 的,无法从外部注入)。
Functions§
- dropped_
count - 进程启动以来累计丢弃的日志条数。
- log_
viewer_ filter - capture 层的独立 EnvFilter:读
LOG_VIEWER_LEVEL,非法/缺失时回退 “info”。 故意不吃RUST_LOG——控制台级别与查看器级别解耦。 - record_
dropped - 累加丢弃计数(writer 写库失败丢批时按批大小调用)。
- subscribe_
live - 订阅实时流广播(每 SSE 连接一个 receiver)。
- take_
db_ receiver - 取走落库通道接收端(一次性;第二次调用返回 None)。
- truncate_
message 🔒 - 按字节上限截断,回退到 char 边界防止切坏 UTF-8。