ctrlb-decompose: 用于 LLMs 的日志压缩和模式提取
ctrlb-decompose: 用于 LLMs 的日志压缩和模式提取
用于 LLM 分析的日志压缩
ctrlb-decompose 是一个高性能工具,旨在从原始日志中去除噪声,将数百万行日志转换为少量可操作的结构模式。此过程在将日志馈送到大型语言模型 (LLM) 时可减少令牌消耗和噪声,使模型能够基于日志的结构本质进行推理,而不是逐行处理重复内容。
双阶段归一化和聚类管道
ctrlb-decompose 使用两阶段管道在单次流式传输中以最小的内存占用处理日志:
阶段 1: CLP 编码
该工具使用压缩日志处理器 (CLP) 编码将变量标记归一化为类型化的占位符。这确保了结构相同的行无论具体数值如何,都会生成相同的 "logtype"。例如,像 Request from 10.0.1.15 completed in 45ms status=200 这样的行会被归一化为 Request from <dict> completed in <float>ms status=<int>。
阶段 2: Drain3 聚类
编码之后,Drain3 算法在 logtype 上构建前缀树,根据标记相似性(默认阈值为 0.4)将其分组。当标记出现分歧时,工具会插入 <*> 通配符以创建模板。此过程是增量的,意味着每行只需处理一次,无需第二次遍历。
变量分类和语义类型
提取的变量将被分类为语义类型,以提供更丰富的分析和统计信息。该工具检测以下类型:
| 类型 | 示例 | 检测方法 |
|---|---|---|
IPv4 / IPv6 |
10.0.1.15 |
CIDR 模式匹配 |
UUID |
550e8400-e29b-... |
8-4-4-4-12 十六进制格式 |
Duration |
45ms, 3.2s |
数字 + 时间单位后缀 |
HexID |
0x1a2b3c |
4+ 十六进制位数 |
Integer |
200 |
解析为 i64 |
Float |
3.14 |
包含 .,解析为 f64 |
Enum |
ERROR |
基数低(<=20 唯一,前 3 名 >= 80%) |
Timestamp |
2024-01-15T14:22:01Z |
RFC 3339 模式 |
String |
any other value | 后备 |
内存效率和统计累积
为了保持低内存占用,ctrlb-decompose 使用了几种概率数据结构:
- Drain3 聚类:以 O(k) 复杂度管理并采用 LRU 淘汰(最多 10k)。
- 分位数:使用 DDSketch 来维持每个数值槽固定约 200 字节,而不存储原始值。
- 基数:采用 HyperLogLog++ 来处理高基数变量(每个变量约 200 字节)。
- 示例:使用蓄水池抽样为每种模式维护一个有界的示例行缓冲区。
输出格式和集成
ctrlb-decompose 支持三种主要的输出格式以适应不同的工作流程:
- Human (
--human): 默认输出,具有 ANSI 颜色和可视化条形图,用于终端检查。 - LLM (
--llm): 一种紧凑且令牌高效的 Markdown 格式,专门设计用于 LLM 消费。 - JSON (
--json): 一种用于程序化消费的结构化格式。
Claude Code 插件
该工具通过插件与 Claude Code 集成。用户可以使用 /plugin marketplace add ctrlb-hq/ctrlb-decompose 进行安装,然后使用诸如 "Analyze the errors in /var/log/app.log." 之类的自然语言命令分析日志。
社区见解
"最后,一个工具能够解决此问题而不迫使你采用整个生态系统。我欣赏它如何通过仅专注于分解步骤并做好它来践行 Unix 哲学。"
安装
ctrlb-decompose 可通过 macOS 的 Homebrew 获得(brew install ctrlb-decompose),也可作为 Debian/Ubuntu 的 .deb 包,或者可以使用 Cargo 从源码构建。