Skip to main content

Module capture

Module capture 

Source
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 满了最旧事件被覆盖,接收端走 Laggedgap 事件。
  • 防递归yggdrasil::api::logsyggdrasil::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§

CaptureLayer
日志捕获 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)。
MessageVisitor 🔒
事件字段提取: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。