Skip to main content

log-ai-compressor · 本机日志取证层

我们不把日志交给大模型。我们用确定性算法把日志变成可复核的证据,大模型只读证据。 拿不出因果链就说证据不足,并精确列出还缺什么才能定论 —— 而且会对这些缺口负责:补上了就把缺口划掉。 全部计算在本机完成,日志不出网。

CI PyPI Python 3.11+ License: MIT

Web 界面:判定卡片给出「不可作为根因输出」,下方是按 trace_id 重建的调用链


🧾 立场:你不必相信这个工具

大多数日志工具要你相信它的结论。这个工具给的是你可以自己复核的东西 —— 每条结论都带原文的行号区间和那段原文的 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.md Q10。


📌 先读这一节:这些数字不能证明什么

一个只会报好数字的项目不值得信。下面是所有实测结论都覆盖不到的地方。

我们不能证明 原因
根因准确率高于云平台 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)

Source distribution for log-ai-compressor 2.9.8
File Size Uploaded
log_ai_compressor-2.9.8.tar.gz 643.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for log-ai-compressor 2.9.8
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

This release

2.9.8 This release

2 release files

2.9.7

2 release files

2.9.6

2 release files

2.9.4

2 release files

2.9.3

2 release files

2.9.2

2 release files

2.9.1

2 release files

2.9.0

2 release files

2.8.1

2 release files

2.8.0

2 release files

2.7.0

2 release files

2.6.0

2 release files

2.5.0

2 release files

2.4.0

2 release files

2.3.0

2 release files

2.2.0

2 release files

2.1.0

2 release files

2.0.1

2 release files

2.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page