# log-analyzer-bug-ai **Repository Path**: test-dev-qa/log-analyzer-bug-ai ## Basic Information - **Project Name**: log-analyzer-bug-ai - **Description**: BUG分诊机器人: 1.采集微服务log日志AI分析诊断BUG 2.提交BUG单并同步飞书多维表格 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/test-dev-qa/log-analyzer-bug-ai - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-09-15 - **Last Updated**: 2026-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: bug ## README # log-analyzer-bug-ai 服务器 Docker 错误日志 → 规则/知识库/LLM 诊断 → 飞书 BUG 工单/群卡片,全自动流水线。 ![whistle-jmeter插件-bug分诊机器人.png](whistle-jmeter%E6%8F%92%E4%BB%B6-bug%E5%88%86%E8%AF%8A%E6%9C%BA%E5%99%A8%E4%BA%BA.png) ``` 关联项目:whistle-jmeter插件 https://gitee.com/test-dev-qa/whistle-jmeter-framework-ai ``` ## 架构 ``` ┌──────────────────┐ ERROR/FATAL ┌──────────────────────────────────────────────┐ │ Docker 日志源 │ ─────────────► │ 分析层(优先级递减) │ │ 本机 / SSH 远程 │ 堆栈聚合+过滤 │ 规则引擎 → 知识库 → Embedding RAG → LLM(限流) │ └──────────────────┘ MD5 指纹 └──────────────────────┬───────────────────────┘ │ JSON ▼ ┌─────────────────────────────────────────────────────┐ │ 交付层 │ │ 飞书多维表格(upsert) + Webhook/群 BUG 卡片 │ │ Coroot Trace + 诊断来源 + 分级通知 + 仅新建工单推群 │ └─────────────────────────────────────────────────────┘ ``` > 交付层细节(process_chunk 流水线、diagnosis_source 瀑布、Coroot Trace 按钮、NOTIFY_MIN_SEVERITY / NOTIFY_ONLY_NEW)见 **[docs/coroot-trace-diagnosis-notify.md](docs/coroot-trace-diagnosis-notify.md)**。 > 常见问题汇总见 **[docs/FAQ.md](docs/FAQ.md)**。 | 阶段 | 能力 | |------|------| | **采集** | 本机 `docker logs -f`;SSH 远程多容器;cron 批量扫描全容器 | | **预处理** | 堆栈智能聚合、容器 include/exclude 过滤、healthcheck 噪音跳过 | | **分析** | 规则引擎(7条) → 知识库(8条) → 相似度/Embedding RAG → LLM;429 重试队列 | | **去重** | SQLite 指纹库,同根因 upsert 工单而非重复建单 | | **交付** | 飞书 bitable + Webhook interactive 卡片;P2+ 推群,P3 仅 bitable | | **运维** | 日报/重试队列/过期消单/健康检查/Prometheus 指标 | --- ## 项目结构 ``` log-analyzer-bug-ai/ ├── log_analyzer_pipeline.py # 薄入口 → log_analyzer.cli.main() ├── log_analyzer/ # 模块化 Python 包 │ ├── config.py # 环境变量与全局常量(导入时自动加载 .env) │ ├── env_loader.py # 进程内 UTF-8 加载 .env(直跑与 ./run.sh 行为一致) │ ├── feishu.py # FeishuClient、BUG 卡片、Webhook、记录构建 │ ├── llm.py # LLM 分析(Ollama / OpenAI 兼容) │ ├── watchers.py # 日志监听(本地文件 / Docker / SSH) │ ├── pipeline.py # process_chunk、run_pipeline │ ├── batch_scan.py # Docker 批量扫描 │ ├── ops.py # 日报、消单、重试队列、健康检查、Prometheus │ ├── cli.py # argparse 主入口 │ ├── enhance.py # 指纹、规则引擎、知识库、限流、指标 │ └── integrations/ │ ├── meegle.py # Meegle 工单同步(可选) │ └── embedding.py # Embedding 向量 RAG(可选) ├── analyzer_enhance.py # 向后兼容 re-export ├── embedding_rag.py # 向后兼容 re-export ├── meegle_sync.py # 向后兼容 re-export ├── run.sh # 启动脚本(可选;load_env → exec python) ├── .env.example # 配置模板 ├── requirements.txt ├── rules/rules.json # 外置诊断规则(+ 内置 4 条 = 7 条) ├── knowledge/fixes.json # 知识库(8 条,含相似度 RAG) ├── scripts/ │ ├── deploy-devserver.sh # 一键部署 + 4 条 cron │ └── docker_errors_scan.sh # Docker 错误扫描 shell └── data/ # 运行时数据(gitignore) ├── fingerprints.db # 指纹 → bitable record_id ├── retry_queue.jsonl # LLM 429/503 待重试块 ├── metrics.json # 运行指标 ├── metrics.prom # Prometheus 格式 ├── last_digest.txt # 日报每日锁 ├── meegle_sync.json # Meegle 同步映射 └── embeddings.db # Embedding 向量库(可选) ``` ### 模块职责 | 模块 | 职责 | |------|------| | `cli.py` | 命令行参数解析与分发 | | `pipeline.py` | 核心编排:过滤 → 指纹 → 分析 → 飞书 upsert → 通知 | | `enhance.py` | 堆栈指纹、规则/知识库引擎、LLM 限流、SQLite、运行指标 | | `feishu.py` | bitable CRUD、Webhook/群 interactive 卡片 | | `batch_scan.py` | 全容器 Docker 错误批量扫描 | | `ops.py` | 日报、重试队列、过期消单、健康检查 | | `integrations/` | Meegle 同步、Embedding RAG | --- ## 能力清单 ### 日志采集 - **实时监听**:`-f docker://pm-gateway,pm-system` 或本地文件、SSH 远程 - **批量扫描**:`--batch-docker-scan --since 15m`(cron 每 5 分钟,窗口 15m) - **远程扫描**:`--ssh-target root@192.168.31.6` - **容器过滤**:`CONTAINER_INCLUDE=` 默认不过滤;`CONTAINER_EXCLUDE=cadvisor,...` 排除监控容器 - **Shell 脚本**:`scripts/docker_errors_scan.sh`(grep 上下文 **50 行**)→ 详见 [docs/docker-errors-scan.md](docs/docker-errors-scan.md) ### 智能分析(四层递进,命中即跳过 LLM) | 层级 | 来源 | 说明 | |------|------|------| | 1 | 规则引擎 | 7 条(Redis/Nacos/OOM/端口 + 外置 MyBatis/MySQL/Nacos) | | 2 | 知识库 | 8 条 regex 匹配(NPE/Feign/类加载/JSON/Token/SpringBoot/连接池/超时) | | 3 | 相似度 RAG | Jaccard token 匹配知识库(阈值 0.35) | | 4 | Embedding RAG | 向量相似检索历史诊断(`EMBEDDING_ENABLED=true`) | | 5 | LLM | OpenAI 兼容 API(DeepSeek / edgefn),含历史 fix 提示增强 | - **限流与重试**:`MAX_LLM_QPS=2`;429/503 → `retry_queue.jsonl` - **堆栈指纹**:同根因多容器合并,SQLite 持久化 hit_count ### 飞书交付 - **多维表格**:自动建单/更新(upsert),字段模式 `rd` - **Webhook 卡片**:interactive 卡片,含诊断来源、Coroot Trace、查看工单 - **分级通知**:`NOTIFY_MIN_SEVERITY=P2`,P3 仅 bitable - **防刷群**:`NOTIFY_ONLY_NEW=true`(默认),仅新建工单推 Webhook - **多环境分流**:`ENV_ROUTING=pm-dev-:dev,pm-:prod` 按容器前缀选 Webhook ### 运维工具 | CLI | 说明 | |-----|------| | `--batch-docker-scan` | Docker 批量扫描(主 cron) | | `--process-retry-queue` | 消费 LLM 失败重试队列 | | `--daily-digest` | 24h 指纹汇总(每天 1 次,`--force-digest` 强制) | | `--stale-check` | 标记 N 天未复现指纹为 resolved | | `--health-check` | 检查 LLM/飞书/Docker 连通性 | | `--export-prometheus` | 导出 `data/metrics.prom` | | `--check-bitable` | 表结构体检:列结构/关键列匹配/附件上传自检/试写载荷 | | `--repair-bitable` | 回填历史空「所属环境」/空附件(`--repair-dry-run` 预览、`--repair-env-value`、`--repair-limit`) | | `--explain-log PATH` | 离线诊断:对任意日志文件跑完整判定链,逐阶段显示在哪一步被拦下(不调 LLM/飞书) | | `--show-skipped` | 列出近期"命中错误但未入表"的台账 `data/skipped_chunks.jsonl` | --- ## CLI 用法 > **启动方式等价**:`./run.sh ` ≡ `python3 log_analyzer_pipeline.py `。 > `.env` 由 `log_analyzer/env_loader.py` 在 `config.py` 导入时自动加载(UTF-8,不覆盖已显式导出的非空变量), > 因此**直接跑 Python 也不会出现「飞书凭证未配置, 记录将仅本地打印」**。 > 查找顺序:包根目录 `.env` → 当前工作目录 `.env`。 ```bash ./run.sh --batch-docker-scan --since 15m # 批量扫描 ./run.sh --process-retry-queue # 重试队列 ./run.sh --daily-digest # 日报(每日锁) ./run.sh --daily-digest --force-digest # 强制重推日报 ./run.sh --stale-check --stale-days 7 # 过期消单 ./run.sh --health-check # 健康检查 ./run.sh --export-prometheus # Prometheus 指标 ./run.sh -f docker://pm-gateway,pm-system # 实时监听 ./run.sh --check-bitable # 表结构体检(字段/附件/权限) ./run.sh --repair-bitable --repair-dry-run # 预览历史空字段回填 ./run.sh --repair-bitable \ # 执行回填 --repair-env-value "devserver-31.98 · 192.168.31.98" --repair-limit 100 ./run.sh --explain-log /var/log/pm-collection.log \ # 离线诊断: 这条 ERROR 为何没进表 --explain-source docker://pm-collection --explain-tail 200 ./run.sh --show-skipped --show-skipped-limit 20 # 近期"命中错误但未入表"台账 ``` ```aiignore # docker宿主机器:查看采集分析BUG单日志命令 grep -E "多维表格写入失败|处理错误块失败|以下列写入受阻|带附件建单失败" /var/log/log_analyzer_batch.log | tail -20 grep -E "批量扫描处理完成|分析判定完成|规则引擎命中|知识库命中|开始执行 LLM" /var/log/log_analyzer_batch.log | tail -20 # 重新跑一次批量扫描,飞书附件即为中心化后的报错上下文 python3 log_analyzer_pipeline.py --batch-docker-scan --since 30m ``` --- ## 快速开始 ```bash git clone https://gitee.com/test-dev-qa/log-analyzer-bug-ai.git cd log-analyzer-bug-ai pip install -r requirements.txt cp .env.example .env # 填写 LLM_API_KEY、飞书凭证、Webhook ./run.sh --health-check # 逐项确认 LLM / 飞书 / Docker 连通性与凭据齐全 ./run.sh --batch-docker-scan --since 15m ``` > 只想快速试跑也可以直接 `python3 log_analyzer_pipeline.py --batch-docker-scan --since 15m`(`.env` 会自动加载)。 > 若日志出现 `飞书凭证未配置, 记录将仅本地打印`,说明凭据缺失 → 见 [docs/FAQ.md](docs/FAQ.md) Q2.6。 --- ## 配置说明 完整配置见 [`.env.example`](.env.example)。 | 分类 | 变量 | 说明 | |------|------|------| | LLM | `LLM_PROVIDER` / `LLM_BASE_URL` / `LLM_API_KEY` / `MODEL_NAME` | OpenAI 兼容 API | | 采集 | `CONTAINER_INCLUDE` / `CONTAINER_EXCLUDE` | 容器过滤 | | 分析 | `MAX_LLM_QPS` / `NOTIFY_MIN_SEVERITY` / `COROOT_UI_URL` | 限流、分级、Trace | | 通知 | `FEISHU_WEBHOOK` / `NOTIFY_ONLY_NEW` | Webhook 地址、仅新建推群 | | 附件 | `LOG_ATTACH_ENABLED` / `LOG_ATTACH_LINES` / `FEISHU_ATTACH_FIELD` | 建单时上传异常日志到 bitable 附件列 | | 规则 | `RULES_FILE` / `KNOWLEDGE_FILE` | 外置规则与知识库路径 | | 集成 | `MEEGLE_ENABLED` / `EMBEDDING_ENABLED` / `ENV_ROUTING` | 可选扩展 | ### 生产 devserver 配置示例 ```env LLM_PROVIDER=openai LLM_BASE_URL=https://api.edgefn.net/v1 LLM_API_KEY=sk-xxxxxxxx MODEL_NAME=DeepSeek-R1-0528-Qwen3-8B FEISHU_WEBHOOK=https://open.feishu.cn/open-apis/bot/v2/hook/xxx NOTIFY_ONLY_NEW=true NOTIFY_MIN_SEVERITY=P2 CONTAINER_INCLUDE= CONTAINER_EXCLUDE=cadvisor,node_exporter,openobserve,coroot-,playwright_ ``` --- ## devserver 部署 (192.168.31.6) ```bash git clone https://gitee.com/test-dev-qa/log-analyzer-bug-ai.git /opt/log-analyzer-bug-ai cd /opt/log-analyzer-bug-ai cp .env.example .env # 填写凭证 ./scripts/deploy-devserver.sh ``` ### 生产 Cron(4 条) | # | Cron | 命令 | 说明 | 日志 | |---|------|------|------|------| | 1 | `*/5 * * * *` | `--batch-docker-scan --since 15m` | 扫描 Docker 错误 → 诊断 → bitable/Webhook | `/var/log/log_analyzer_batch.log` | | 2 | `*/10 * * * *` | `--process-retry-queue` | 消费 LLM 429/503 重试队列 | `/var/log/log_analyzer_retry.log` | | 3 | `0 9 * * *` | `--daily-digest` | 推送 24h 指纹汇总(每日 1 次) | `/var/log/log_analyzer_digest.log` | | 4 | `0 3 * * 0` | `--stale-check --stale-days 7` | 标记 7 天未复现指纹为 resolved | `/var/log/log_analyzer_stale.log` | --- ## 数据流 ``` Docker ERROR → 堆栈聚合 + 容器过滤 → 指纹已存在? ──是──► bitable 更新 hit_count(不推 Webhook) → 规则引擎 → 知识库 → Embedding RAG → LLM(限流) → 新指纹 → bitable 建单 + SQLite + Webhook(NOTIFY_ONLY_NEW) → NOTIFY_MIN_SEVERITY 过滤 → 推群 ``` --- ## 飞书多维表格配置 ![AI诊断BUG同步飞书多维表格.png](AI%E8%AF%8A%E6%96%ADBUG%E5%90%8C%E6%AD%A5%E9%A3%9E%E4%B9%A6%E5%A4%9A%E7%BB%B4%E8%A1%A8%E6%A0%BC.png) > **说明**:程序不会自动创建多维表格,而是向**已有的飞书 bitable** 写入/更新记录。 ### 前置条件 1. 在[飞书开放平台](https://open.feishu.cn/)创建自建应用 2. 开通权限: - `bitable:app`(读写多维表格) - **附件上传需 `drive:drive`(或 `bitable_file`)权限** —— 否则附件列报 `1061073 no scope auth` / `1061004 forbidden` 长期为空 3. 将应用添加为目标多维表格的**协作者** 4. 从表格 URL 获取 `app_token` 和 `table_id` ### 环境变量 | 变量 | 说明 | 示例 | |------|------|------| | `FEISHU_APP_ID` | 应用 App ID | `cli_aaf6b5c8d4f99d1f` | | `FEISHU_APP_SECRET` | 应用 App Secret | `IHY5ldFwxks4x0Mh...` | | `FEISHU_APP_TOKEN` | 多维表格 app_token(URL 中 base/ 后段) | `KLOVbqzeba7s4LsJVzncy6aRnyg` | | `FEISHU_TABLE_ID` | 数据表 table_id(URL 中 table= 后段) | `tblYx8REpvSevMBs` | | `FEISHU_FIELD_MODE` | 字段映射模式 | `rd`(研发项目管理表)或 `standard` | | `FEISHU_BITABLE_URL` | 卡片「查看工单」按钮链接(可选 `{record_id}` 占位) | `https://xxx.feishu.cn/base/...&record={record_id}` | | `FEISHU_ENV_FIELD` | 「所属环境」列名(默认 `所属环境`,在 `config.py`,勿写入易乱码 `.env`) | `所属环境` | | `FEISHU_ATTACH_FIELD` | 附件列名(默认 `日志附件`) | `日志附件` | | `BITABLE_SCHEMA_CHECK` | 写入前校验列名/类型、丢弃只读列 | `true` | | `BITABLE_AUTO_SELECT_OPTION` | 单选列自动补齐选项 | `true` | | `BITABLE_DIAG_MARKER` | 字段/附件失败写诊断标记到「复现步骤」 | `true` | | `PENDING_FIELDS_PATH` | 待修复队列文件路径 | `data/pending_fields.jsonl` | | `SERVER_LABEL` / `SERVER_IP` | 「所属环境」写入值(容器 IP 不准时必配) | `devserver-31.98` / `192.168.31.98` | ### 生产表格(devserver 当前使用) ``` https://yw44kxy3i0.feishu.cn/base/KLOVbqzeba7s4LsJVzncy6aRnyg?table=tblYx8REpvSevMBs ``` `.env` 配置示例: ```env FEISHU_APP_ID=cli_aaf6b5c8d4f99d1f FEISHU_APP_SECRET=your_secret FEISHU_APP_TOKEN=KLOVbqzeba7s4LsJVzncy6aRnyg FEISHU_TABLE_ID=tblYx8REpvSevMBs FEISHU_FIELD_MODE=rd ``` ### 字段映射(`FEISHU_FIELD_MODE=rd`) | 分析结果字段 | bitable 列名 | 内容 | |-------------|-------------|------| | `error_title` | 问题名称 | 故障摘要,如「Spring Boot 启动失败」 | | `severity` | 优先级 | P0→高-P0, P1→中-P1, 其他→低-P2 | | `service_name` | 所属模块 | 容器/服务名,如 `pm-aigc` | | `SERVER_LABEL` + `SERVER_IP` | **所属环境** | 与卡片一致,如 `devserver-31.98 · 192.168.31.98` | | 根因+建议+环境+容器 | 复现步骤 | 含服务器 IP、容器、根因推测、修复建议 | 列名可通过 `FEISHU_ENV_FIELD` 覆盖(默认 `所属环境`)。若该列为**单选**,请预先在表格中添加与环境标签一致的选项名。 > **字段自愈(v 新增)**:写入前 `feishu.prepare_fields()` 会对列名做 `normalize_field_name`(去 BOM/零宽/空白)+ `repair_mojibake`(latin-1 乱码修复)+ 单向前缀匹配(仅当配置名是表内列名前缀且唯一命中,避免写错列);匹配不到的列被丢弃但其余字段仍落库,不再整单静默失败。单选列选项缺失会 `ensure_select_option` 自动补齐(`BITABLE_AUTO_SELECT_OPTION`)。若「所属环境」/`日志附件` 历史上为空,用 `--check-bitable` 体检 + `--repair-bitable` 回填(`BITABLE_DIAG_MARKER` 会在「复现步骤」标注失败原因,并落 `data/pending_fields.jsonl`)。 ### 异常日志附件(可选) 新建工单时可将异常上下文(默认 50 行)保存为 `.log` 并上传到 bitable **附件**列。详见 [docs/log-attach-bitable.md](docs/log-attach-bitable.md)。 #### 在哪里配置 `LOG_ATTACH_ENABLED=true` | 部署方式 | 配置文件 | 说明 | |----------|----------|------| | **远程服务器(推荐)** | `/opt/log-analyzer-bug-ai/.env` | 手动编辑或 BUG 分诊「部署/更新」写入;改后 cron/试跑自动生效 | | **本地模板** | 项目根目录 [`.env.example`](.env.example) | 复制为 `.env` 后修改,供 `./run.sh` 使用 | | **BUG 分诊机器人部署** | Whistle 插件 `lib/bugTriageDeploy.js` → `buildEnvFile()` | 部署脚本默认写 `LOG_ATTACH_ENABLED=true`;重新「部署/更新」后写入远程 `.env` | | **运行时读取** | `log_analyzer/config.py` | 从环境变量读取;导入时先经 `env_loader.load_dotenv()` 自动加载 `.env`,**不要改代码默认值**,应改 `.env` | #### 启用步骤 1. 在飞书多维表格新增 **附件** 类型列,列名 `日志附件`(或自定义后用 `FEISHU_ATTACH_FIELD` 对齐) 2. 在目标服务器 `.env` 中设置: ```env LOG_ATTACH_ENABLED=true LOG_ATTACH_LINES=50 FEISHU_ATTACH_FIELD=日志附件 ``` 3. 若通过 BUG 分诊部署:保存配置 → **部署/更新**(会重写远程 `.env`) 4. 手动验证:`./run.sh --batch-docker-scan --since 15m`,新建工单行的「日志附件」列应出现 `.log` 文件 > 默认 `LOG_ATTACH_ENABLED=true`;若表格尚未建附件列,可临时设为 `false`。指纹重复更新工单**不会**重复上传附件。 更多常见问题见 [docs/FAQ.md](docs/FAQ.md)。 `standard` 模式使用专用 8 字段表(错误摘要/服务模块/故障等级/是否BUG/根因推测/修复建议/处理状态/发现时间)。 ### API 实现(`log_analyzer/feishu.py`) ``` 1. 鉴权 POST /auth/v3/tenant_access_token/internal → tenant_access_token(自动刷新) 2. 新建工单(新指纹) POST /bitable/v1/apps/{app_token}/tables/{table_id}/records body: { "fields": { "问题名称": "...", ... } } → record_id(如 recvld8MAevxI) 3. 更新工单(指纹重复) PUT /bitable/v1/apps/{app_token}/tables/{table_id}/records/{record_id} → 更新 hit_count / 容器列表 4. 指纹去重 SQLite fingerprints.db 存 signature → record_id 映射 同根因 upsert,不重复建单 ``` ### Webhook 与 bitable 关系 | 通道 | 配置 | 用途 | |------|------|------| | **多维表格** | `FEISHU_APP_*` | 持久化工单,可手动改状态为「已处理」 | | **Webhook 卡片** | `FEISHU_WEBHOOK` | 群消息实时告警(仅新建工单,`NOTIFY_ONLY_NEW=true`) | | **群卡片**(可选) | `FEISHU_SEND_TO_CHAT` + `FEISHU_DEFAULT_CHAT_ID` | 应用 API 发 interactive 卡片 | --- ## 通知控制(关闭/减少 BUG 卡片推送) | 目标 | 做法 | bitable 建单 | 群 Webhook 卡片 | |------|------|-------------|----------------| | **完全停止** | 停用 cron(UI「停用分诊」或注释 crontab) | 停止 | 停止 | | **只停群卡片,保留建单** | `.env` 清空 `FEISHU_WEBHOOK=` | 继续 | 停止 | | **减少推送** | `NOTIFY_ONLY_NEW=true`(默认) | 继续 | 仅新建工单推 1 次 | | **只推 P0/P1** | `NOTIFY_MIN_SEVERITY=P1` | 继续 | P2/P3 不推群 | > 仅注释 `batch-docker-scan` cron 会同时停止日志扫描和 bitable 建单,不只是卡片。日报 cron(9:00)需单独处理。 ### 常用操作 ```bash # 只停群卡片(保留 bitable 建单) FEISHU_WEBHOOK= # 完全暂停(devserver) crontab -e # 注释 4 条 log-analyzer 相关 cron # 或在 whistle-jmeter UI → BUG分诊机器人 →「停用分诊」 # 恢复 # UI「启用分诊」或取消 cron 注释 ``` 相关环境变量: | 变量 | 默认值 | 说明 | |------|--------|------| | `FEISHU_WEBHOOK` | — | 为空则不推群卡片 | | `NOTIFY_ONLY_NEW` | `true` | 指纹重复更新时不推 Webhook | | `NOTIFY_MIN_SEVERITY` | `P2` | 低于此等级仅写 bitable | --- ## 飞书消息类型 | 消息 | 触发 | 频率 | 样式 | |------|------|------|------| | **BUG 卡片** | 批量扫描新建 P0/P1/P2 工单 | 按需 | 单条 interactive 卡片 | | **日报汇总** | cron 9:00 | 每天 1 条 | 蓝色卡片,Top 15 指纹列表 | --- ## 演进路线 | Sprint | 内容 | |--------|------| | 1~4 | 指纹去重、规则引擎、卡片增强、重试队列、日报 cron | | 5~6 | 知识库 RAG、运行指标、过期消单、卡片操作按钮 | | 7~8 | Meegle/多环境/Prometheus、相似度 RAG | | 9 | Embedding RAG、健康检查、Webhook 防刷 | | 10 | 模块化重构 `log_analyzer/` 包 | ### 待配置扩展 - **Meegle**:`MEEGLE_ENABLED=true` + `meegle auth login` - **Embedding RAG**:`EMBEDDING_ENABLED=true`(需 embedding API) - **多环境 Webhook**:`ENV_ROUTING` + `FEISHU_WEBHOOK_DEV` 等 - **node_exporter**:采集 `data/metrics.prom` --- ## License Apache-2.0