展示 HN:Ctrlb-decompose:在发送到 LLM 之前剥离日志中的噪声
将原始日志行压缩为具有统计信息、异常和相关性的结构模式。将数百万条嘈杂的日志行转化为少数可操作的模式——带有类型变量、分位数统计、异常标志和严重性评分。作为 CLI 运行,通过 WASM 在浏览器中运行,或作为 Rust 库。$ cat server.log | ctrlb-decompose ┌────────────────────────────────────────────────────────────────────┐ │ ctrlb-decompose:1,247,831 行 -> 43 种模式(99.9% 的减少) │ └────────────────────────────────────────────────────────────────────┘ #1 [错误] ██████████████████████ 18,402 (1.5%) <TS> 错误 [<*>] 连接到 <ip> 超时 <duration> ip IPv4 唯一=12 前10:10.0.1.15 (34%),10.0.1.22 (28%) duration 持续时间 p50=120ms p99=4.8s #2 [信息] ████████████████████ 904,221 (72.5%) <TS> 信息 [<*>] 来自 <ip> 的请求在 <duration> 内完成 状态=<status> ip IPv4 唯一=1,847 前10:10.0.1.15 (12%),10.0.1.22 (8%) duration 持续时间 p50=23ms p99=312ms 状态 枚举 唯一=3 值:200 (91%),404 (6%),500 (3%) 网站即将上线。工作原理 ctrlb-decompose 使用两阶段标准化和聚类管道,使用最小内存占用在单个流式传输中处理日志。 ┌──────────────────────────────────────────────┐ │ ctrlb-decompose 管道 │ └──────────────────────────────────────────────┘ 原始日志行 │ ▼ ┌──────────────┐ 剥离并解析时间戳(ISO 8601,Apache, │ 时间戳 │ syslog,Unix 纪元等)为标准化的 │ 提取 │ <TS> 标记及 DateTime 值。 └──────┬───────┘ │ ▼ ┌──────────────┐ 用紧凑的占位符字节替换整数、浮点数、IP 和字符串 │ CLP │。结构上相同的行现在生成相同的 “logtype”。 └──────┬───────┘ │ ▼ ┌──────────────┐ 基于树的相似性聚类(Drain3)将 │ Drain3 │ logtypes 组合成模式。不同的标记变成 │ 聚类 │ <*> 通配符。增量 — 不需要第二次处理。 └──────┬───────┘ │ ▼ ┌──────────────┐ 合并 CLP 解码值与 Drain3 通配符 │ 变量 │ 位置。将每个变量分类为语义 │ 提取 │ 类型:IPv4、UUID、持续时间、枚举、整数等。 │ & 类型 │ └──────┬───────┘ │ ▼ ┌──────────────┐ DDSketch 分位数(p50/p99)、HyperLogLog │ 统计 │ 基数估算、top-k 值、时间 │ 累积 │ 桶装和水库采样的示例行。 └──────┬───────┘ │ ▼ ┌──────────────┐ 频率尖峰、错误级联、低基数 │ 异常 │ 标志、双峰分布和聚类 │ 检测 │ 数值检测。 └──────┬───────┘ │ ▼ ┌──────────────┐ 基于关键字的严重性(ERROR > WARN > INFO > DEBUG), │ 评分 │ 时序共现、共享变量相关性, │ & 相关性│ 以及跨模式的错误级联检测。 └──────┬───────┘ │ ▼ ┌──────────────┐ │ 输出 │──── 人类(ANSI 终端)/ LLM(紧凑 Markdown)/ JSON └──────────────┘ 第1阶段 — CLP 编码 CLP(压缩日志处理器)编码将变量标记标准化为类型占位符,因此结构上相同的行无论实际值如何,都生成相同的 logtype: 输入:“来自 10.0.1.15 的请求在 45ms 内完成 状态=200” Logtype:“来自 <dict> 的请求在 <float>ms 内完成 状态=<int>” 第2阶段 — Drain3 聚类 Drain 算法在 logtypes 上构建前缀树,并通过标记相似性进行分组(可配置阈值,默认0.4)。当标记不同时,模板获得 <*> 通配符。这个过程增量进行 — 每行处理一次,无需进行第二次处理。 变量分类 提取的变量被分类为语义类型,以实现更丰富的分析: 类型 示例 检测 IPv4 / IPv6 10.0.1.15 CIDR 模式匹配 UUID 550e8400-e29b-... 8-4-4-4-12 十六进制格式 持续时间 45ms,3.2s 数字 + 时间单位后缀 HexID 0x1a2b3c 4+ 十六进制数字 整数 200 解析为 i64 浮动 3.14 包含 . ,解析为 f64 枚举 ERROR 低基数(<=20 唯一,前3 >= 80%) 时间戳 2024-01-15T14:22:01Z RFC 3339 模式 字符串 其他内容 回退 内存效率 Drain3 聚类 : O(k) 使用 LRU 驱逐(默认 10k 最大值) 分位数 : DDSketch — 每个数字槽固定 ~200 字节,且不存储原始值 基数 : HyperLogLog++ — 每个高基数变量 ~200 字节 示例 : 水库抽样 — 每个模式的有界缓冲区 安装 macOS(Homebrew) brew tap ctrlb-hq/tap brew install ctrlb-decompose Debian / Ubuntu curl -LO https://github.com/ctrlb-hq/ctrlb-decompose/releases/download/v0.1.0/ctrlb-decompose_0.1.0-1_amd64.deb sudo dpkg -i ctrlb-decompose_0.1.0-1_amd64.deb 从源代码构建 git clone https://github.com/ctrlb-hq/ctrlb-decompose.git cd ctrlb-decompose cargo build --release # 二进制文件在 target/release/ctrlb-decompose 使用 # 从标准输入管道 cat /var/log/syslog | ctrlb-decompose # 从文件读取 ctrlb-decompose server.log # LLM 优化的输出(紧凑、有效的标记) ctrlb-decompose --llm app.log # JSON 输出 ctrlb-decompose --json app.log # 前 10 种模式及各 3 行示例 ctrlb-decompose --top 10 --contex
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡