log-ai-compressor · 本机日志取证层
我们不把日志交给大模型。我们用确定性算法把日志变成可复核的证据,大模型只读证据。 拿不出因果链就说证据不足,并精确列出还缺什么才能定论 —— 而且会对这些缺口负责:补上了就把缺口划掉。 全部计算在本机完成,日志不出网。
🧾 立场:你不必相信这个工具
大多数日志工具要你相信它的结论。这个工具给的是你可以自己复核的东西 —— 每条结论都带原文的行号区间和那段原文的 sha256。
$ log-ai-compressor run app.log -f json -o report.json
$ log-ai-compressor verify --report report.json
证据:共 8 条引用,匹配 8 条,失配 0 条,源不可读 0 条
事故复盘时,有人把日志里的主机名改了:
$ log-ai-compressor verify --report report.json
证据:共 8 条引用,匹配 7 条,失配 1 条
✗ MISMATCH ca0e981df461 app.log 期望 c33aeb824ce67aaf 实际 4a1689f3780880ae
自校验结论:TAMPERED # 退出码 1
判定只有三档,没有「大部分通过」 —— 一份掺了假证据的报告,不该因为大部分为真就放行。
同一套立场长成了四件具体的事:
| 我们怎么做 | 通常的反面 |
|---|---|
拿不出 Caused by 因果链就只给 LIKELY,并列出还缺什么才能定论,补上了就划掉 |
给一个听起来很像回事的根因 |
| 同一份日志跑两遍,结论指纹逐字节相同 | 每次结论都不一样,没法归档、没法追责 |
| 证据摘要只认文件原始字节,剥过 ANSI 的文本不算 | 同一行原文,两条出口给两个摘要 |
| 撤回过一个跑不出来的召回率数字(91.4%),并公开查了哪六条路径 | 挂着一个复现不了的漂亮数字 |
第四行是我最想让你注意的一行:一个主动撤回自己招牌数字的项目, 它剩下的每个数字才有分量。见
docs/FAQ.mdQ10。
📌 先读这一节:这些数字不能证明什么
一个只会报好数字的项目不值得信。下面是所有实测结论都覆盖不到的地方。
| 我们不能证明 | 原因 |
|---|---|
| 根因准确率高于云平台 | RCA100 的结论是 62.5% 的根因案例至少需要两种模态、31% 需要三种。本工具只有日志一种,跟它们不是同一场比赛 |
| 在所有日志形态上都优于 Drain3 | 实测 Loghub 10 个数据集,没赢。同预算档 8 胜 1 平 1 负:HPC 输,OpenSSH 打平。交付口径(产品默认只给 20 个簇)更难看,1 胜 9 负。只有"聚类质量上界"的全量口径是 8 胜 1 平 1 负。三个都列在下面 |
| 压缩比能外推到你的日志 | 12289 倍是 OpenStack 全级别摘要口径下的数字。换个数据集、换个 --context,数量级就变 |
| 「召回率 100%」代表真实生产事故 | 只在 1 个含链真实数据集上测过(Android_v1 全量,131 条链)。样本小,结论未必能外推。原先并列的 Hadoop 91.4% 已于 v2.7.0 撤回 |
| 持续监控与告警 | 没有 agent 埋点、没有时序库、没有告警队列 —— 这是有意的取舍,不是没做完 |
一个云平台说「我不知道」,在产品上读起来像故障。本工具说「我不知道」, 在方法论上读起来像专业。但如果你要的是全天候告警,本工具给不了,别选它。
📊 证据保留率 vs Drain3(Loghub 2.0,10 个数据集)
指标:保住多少种人工标注的事件类型。事件模板来自 Loghub-2.0 的人工标注。
我们报三个口径,因为它们回答三个不同的问题,混着说就是不诚实:
- 交付口径 = 产品默认
top_n=20,用户开箱即用真拿到手的那 20 个簇 - 同预算 32k = 和 Drain3 花同样的 token 能保住多少(主指标)
- 全量口径 = 聚类本身的质量上界,不是用户能收到的,别拿它当成绩
| 数据集 | 标注事件 | 交付 top20 | 同预算 32k | 全量 | Drain3 | LogsLop (AMD) |
|---|---|---|---|---|---|---|
| Proxifier | 11 | 81.8% | 100.0% | 100.0% | 72.7% | 27.3% |
| Apache | 29 | 55.2% | 100.0% | 100.0% | 93.1% | 44.8% |
| OpenSSH | 38 | 36.8% | 92.1% | 92.1% | 92.1% | 34.2% |
| Zookeeper | 89 | 22.5% | 92.1% | 92.1% | 76.4% | 23.6% |
| Linux | 338 | 2.4% | 90.8% | 90.8% | 66.6% | 55.6% |
| Hadoop | 236 | 8.5% | 91.1% | 91.1% | 80.5% | 13.1% |
| HealthApp | 156 | 11.5% | 89.7% | 89.7% | 83.3% | 7.1% |
| OpenStack | 48 | 37.5% | 52.1% | 52.1% | 41.7% | 18.8% |
| HPC | 74 | 23.0% | 85.1% | 85.1% | 87.8% | 4.1% |
| Mac | 626 | 3.2% | 82.9% | 91.5% | 72.2% | 16.1% |
对 Drain3 的战绩:交付口径 1 胜 9 负 / 同预算 8 胜 1 平 1 负 / 全量 8 胜 1 平 1 负。
交付口径那一列低得难看,是因为 Mac 有 626 种事件、Linux 有 338 种,
20 个簇物理上装不下 —— 不是工具差,是产品只给 20 个簇。
把上限算出来看:Zookeeper / Hadoop / Mac 顶格 100%,全部 10 个数据集合计
达成度 82%(实测覆盖率 ÷ min(20,事件数)/事件数)。
这一栏量的是「产品给多少簇」,Drain3 没有这个旋钮,两栏不是同一条起跑线。
OpenSSH 两边都是 35/38,是平手不是赢。
剩下的一个负例不藏,病因查清了:
-
HPC 85.1% vs Drain3 87.8% —— 不是簇数不够,是簇粒度比标注粗:
action start ... boot与action start ... risBoot在 41/44 字符的模板上 编辑距离相似度高达 0.965,于是在 0.85 阈值下被并成一簇,而 Loghub 把它们 算两类事件。试过加「字面词元守卫」把它拆开:覆盖率确实从 85.1% 涨到 93.2%, 但报告从 76 个簇炸成 2,690 个、交付口径从 23.0% 崩到 8.1% —— 那是坏掉的工具。已撤回,根因(
mask_text没归一化主机名)与完整数据 写在 CHANGELOG 与tests/test_cluster_token_guard.py里。
Mac 在 v2.9.8 之前也是负例(58.5% vs 72.2%)。病因不是聚类丢事件,而是报告 把 406 条错误消息当成「变更事件」,逐条写了出来 —— 全篇 33% 的 token 花在 这个假线索上。收敛后同预算从 58.5% 涨到 82.9%。
胜负怎么判的:一律按事件种数比,不用四舍五入后的百分数。 报告只有 1 位小数,0.05pp 以内的差与舍入误差分不开,落在容差里一律记平 (v2.9.6 之前直接比百分数,把一个 0.005pp 的舍入差判成了胜)。
对照的三个都是真工具:Drain3(ICWS'17 学术标准)、 LogsLop(AMD 2026-07,去重工具,与证据保留目标相反)、tail/grep 两条朴素基线。
完整方法学、为什么会在两个数据集上输、以及 v2.9.3「已发布数字系统性偏低」 与 v2.9.5「指标在数用户没收到的东西」两次撤回的经过,全在
docs/BENCHMARK.md。被质疑时先看那里。
🚦 工程指标
| 指标 | 实测值 |
|---|---|
| 生产代码 | 7,601 行(32 个模块),硬依赖只有 PyYAML |
| 测试 | 1,075 用例,覆盖率 96%(漏行 156 / 3,883 语句),ruff 全绿 |
| CI | Ubuntu 3.11 / 3.12 / Windows 3.12 三矩阵,六道门禁:ruff / 单测+覆盖率 / 对抗评分卡 / 确定性指纹 / 自证脚本 / 构建可复现性 |
| 自证脚本 | 现已断言 10 条主张,含「README 工程指标与架构树必须与仓库一致」「README 写的条数不许漂」 |
| 构建 | 可复现 —— 同源码两次构建字节相同,本地/PyPI/GitHub 三方 sha256 对账 |
🚀 90 秒上手
# 本地 Web 界面(自动开浏览器,端口 8765 起,被占用自动顺延)
pip install "log-ai-compressor[web]"
log-ai-compressor web
# 只在命令行里压缩日志:硬依赖只有 PyYAML
pip install log-ai-compressor
log-ai-compressor run app.log --top 20 -o report.md
# 复核一份报告的结论出处(报告发出去后日志可能已被改动或轮转清理)
log-ai-compressor verify --report report.json
# 让 AI Agent 直接调用本机日志(MCP Server,已收录官方 Registry)
pip install "log-ai-compressor[mcp]"
log-ai-compressor mcp --install claude-code
Agent 客户端可直接按官方 Registry 名发现安装:
mcp-name: io.github.hu-chenyu/log-ai-compressor
Windows 可双击 start.bat 自动定位 Python、装依赖、启动并打开浏览器。
🧰 能力
| 领域 | 能做什么 |
|---|---|
| 取证 | 每条结论绑定 evidence_id + 文件 + 行号区间 + 原文 sha256;verify 重读原文逐条核对,被改动报 TAMPERED |
| 确定性 | 报告带「确定性指纹」,同一份日志两次分析结论逐字节相同(耗时与速率已排除) |
| 置信三档 | CONFIRMED / LIKELY / INSUFFICIENT。只有条目内 Caused by: 链才算 CONFIRMED;证据不足时不输出「根因」措辞,改为列出还缺什么 |
| 缺口自闭环 | 缺口清单由日志里实际有什么驱动。日志带 trace_id → 调用链重建成功 → 「缺少调用链关联」自动关闭;一条都没有就如实申报 |
| 解析 | ISO / syslog / logcat / logfmt / JSON Lines / 中式堆栈;可插拔 YAML 规则改配置不改代码;编码自动适配 UTF-8/GBK/UTF-16/32 + .gz/.zip |
| 调用链 | 结构化日志里存在 trace_id 时重建跨服务链路与首个失败点,不需要装 agent、不需要接拓扑 |
| Web 界面 | 零构建零 CDN,离线可用;文件浏览器直选本机文件(不走网络);SSE 实时进度 + 可取消 |
| AI 解读(可选) | 在压缩结果之上生成人话解读。不配 API Key 也能完整用,AI 只是额外一层 |
完整清单与边界见 docs/FEATURES.md。
🚫 它做不到什么
| 它做不到 | 为什么 | 谁行 |
|---|---|---|
| 比云平台更高的根因准确率 | 多模态根因需要指标 + 链路 + 拓扑。本工具只有日志一种 | Datadog / SLS / Dynatrace |
| 持续监控与告警 | 没有 agent 埋点、没有时序库、没有告警队列。这是有意的取舍 | 全部 APM 平台 |
| 调用链追踪 | traces 是从日志里的 trace_id 重建的,不是采集的 |
Jaeger / Tempo |
| 「召回率」实测 | 只有 1 个含链真实数据集(Android_v1 全量,1,555,005 行 / 131 链)。原先并列的 Hadoop 91.4% 已于 v2.7.0 撤回。一个真实数据集撑不起「召回率」这个说法,这是本项目最实在的短板 | — |
| 隐私合规认证 | 它不处理合规,只保证「数据不出本机」 | — |
还有一条是写在代码里而不只是文档里的硬约束:
调用链只证明顺序,不证明因果。 有完整 trace 但没有
Caused by:时, 工具仍然只给LIKELY、can_conclude=false。CONFIRMED的唯一来源 始终是条目内 Caused-by 链。对抗评测里有一个场景专门盯它。
🗂 深入
| 文档 | 里面有什么 |
|---|---|
docs/BENCHMARK.md |
全部实测的方法学、口径、公平性说明、两处落后的病因、撤回记录 |
docs/EVALUATION.md |
对抗性评测(专门设计来误导本工具的 10 个场景)+ 置信档位实测 |
docs/FAQ.md |
逐条回答质疑:「凭什么比 Drain3 强」「自信错误率是不是门槛设高了」… |
docs/POSITIONING.md |
与全品类日志工具的差异论证 |
docs/FEATURES.md |
完整能力清单 |
docs/ARCHITECTURE.md |
模块树、分层依赖、核心算法 |
docs/CLI.md |
完整命令行用法 + 自定义解析规则 |
docs/DEVELOPMENT.md |
开发、测试、门禁说明 |
SKILL.md / INSTRUCTIONS |
接入 Claude Code / Codex / Mavis 等 Agent |
复现本文所有数字:
python scripts/fetch_datasets.py --all # 下公开数据集
python scripts/benchmark_loghub.py # 证据保留率对照
python scripts/prove.py # 自证:不必相信作者,自己跑
License
MIT
Metadata
Release files for log-ai-compressor 2.9.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| log_ai_compressor-2.9.8.tar.gz | 643.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| log_ai_compressor-2.9.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 853.9 kB
Release files / log_ai_compressor-2.9.8.tar.gz
| Download URL | log_ai_compressor-2.9.8.tar.gz |
|---|---|
| Size | 643.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
db453d306c411db3c1896b97095071c2892ff06966e35a2952b6334ce6ab0ad3
|
|
BLAKE2b-256 checksum How to use checksums |
b3dc114b7d8f9aabf00ebe61617373926d5cc597417518b1e9584d198fbd68bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / log_ai_compressor-2.9.8-py3-none-any.whl
| Download URL | log_ai_compressor-2.9.8-py3-none-any.whl |
|---|---|
| Size | 210.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6e0f4152f2513ac8fe59189a11716aedd8bffb396e0e134593fa8230ccda1a33
|
|
BLAKE2b-256 checksum How to use checksums |
b9ffb629db064df3d699c3bacd01f7eed4cbf0667205ea6b7542aea6fa5348c4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|