基于 AI 的日志智能分析平台,通过 Loki 采集任意日志源,利用 大语言模型 (LLM) 进行智能分析,并通过可扩展的 推送通道 发送诊断报告。
- 多渠道 LLM 调度:支持配置多个 LLM 渠道(SiliconFlow、DeepSeek、智谱等),主模型自动重试,失败后按顺序降级至 Fallback 模型,确保分析不中断。
- 通用 LogQL 查询:支持
LOGQL_*前缀定义任意数量查询,不再局限于特定设备类型,可用于交换机、Nginx、数据库、K8s 等任何 Loki 接入的日志源。 - 配置分层复用:通过
INCLUDE机制将公共配置(LLM、Loki、采样参数)与任务配置(查询语句、Prompt)分离,新增任务只需几行配置。 - 动态变量注入:在配置文件中定义变量,LogQL 和 Prompt 中通过
{VARIABLE}自动替换。 - 智能日志采样:防止单设备海量日志导致 Token 溢出,自动首尾截断,阈值可配。
- 解耦发送通道:
send/目录下的模块支持动态加载,无需修改主程序即可扩展推送方式。
aiops/
├── check.py # 主程序
├── requirements.txt # Python 依赖
├── conf/
│ ├── global.conf # 公共配置(LLM、Loki、采样、文案)
│ └── tasks/ # 任务配置目录
│ └── switch.conf # 示例:交换机巡检任务
└── send/ # 发送通道插件
├── __init__.py
├── serverchan.py # Server酱推送
└── serverchan.env # 密钥配置(不入库)
- Python 3.8+
- 安装依赖:
pip install -r requirements.txt- Loki:确保目标日志已通过 Promtail / Alloy 等采集器推送到 Loki。
所有任务共享的基础设施配置:
## Loki 数据源
LOKI_URL=http://localhost:3100/loki/api/v1/query_range
## LLM 通用参数
LLM_TIMEOUT=600
LLM_MAX_RETRIES=2
LLM_RETRY_DELAY=5
LLM_TEMPERATURE=0.1
LLM_TOP_P=0.1
## LLM 模型调度(格式: 渠道名/模型名)
LLM_MAIN_MODEL=siliconflow/Pro/zai-org/GLM-4.7
LLM_FALLBACK_MODELS=siliconflow/Qwen/Qwen3-8B,deepseek/deepseek-chat,zhipu/glm-4-flash
## LLM 渠道定义
LLM_SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1
LLM_SILICONFLOW_API_KEY=sk-xxx
LLM_DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
LLM_DEEPSEEK_API_KEY=sk-xxx
## 发送通道
SEND_CHANNEL=serverchan
## 日志采样
LOG_SAMPLE_HEAD=30
LOG_SAMPLE_TAIL=30
LOG_SAMPLE_THRESHOLD=60
## 报告文案(支持 {time_range} 占位符)
MSG_ALL_CLEAR=✅ 时段 {time_range} 内系统运行平稳,无告警日志。
MSG_LOKI_FAIL=⚠️ 巡检异常: Loki 接口响应失败,请检查网络或 Loki 服务状态。每个任务一个文件,通过 INCLUDE 引入公共配置,仅定义任务专属内容:
## 引入公共配置
INCLUDE=../global.conf
## 任务信息
REPORT_TITLE=【交换机巡检报告】
REPORT_TAG=network_ai_ops
## LogQL 查询(LOGQL_ + 任意后缀,自动收集)
LOGQL_CORE={job="switch", host=~"10.0.0.1|10.0.0.2", level!~"informational|notice"}
LOGQL_ACCESS={job="switch", host!~"10.0.0.1|10.0.0.2", level!~"informational|notice"}
## AI 提示词(必须包含 {combined_context} 占位符)
AI_PROMPT_TEMPLATE="""你是一名网络专家。请分析以下异常日志:
{combined_context}
请给出故障分析和排查建议。"""Server酱示例,在 send/serverchan.env 中配置:
SENDKEY=SCTxxxxxxxxxxx
在 send/ 目录下新建 .py 文件,实现 send_to(title, content, tag) 函数即可,主程序会根据 SEND_CHANNEL 配置自动加载。
主模型 (重试 N 次) Fallback (各尝试 1 次)
───────────── ─────────────────────────
siliconflow/GLM-4.7 ──失败──→ siliconflow/Qwen3-8B ──失败──→ deepseek/chat ──失败──→ zhipu/glm-4-flash
↑ 重试 x2 ↑ 仅 1 次 ↑ 仅 1 次 ↑ 仅 1 次
- 主模型:按
LLM_MAX_RETRIES重试,应对网络抖动等瞬时故障 - Fallback 模型:失败立即切换下一个,快速降级
- 所有渠道仅需兼容 OpenAI
/v1/chat/completions协议
# 每小时整点运行
0 * * * * cd /path/to/aiops && python3 check.py conf/tasks/switch.conf >> /tmp/aiops.log 2>&1脚本自动记录上次运行时间,下次运行时追溯期间的所有日志。
# 查询指定时段(不更新自动运行状态)
python3 check.py conf/tasks/switch.conf "2026-03-25 08:00:00" "12:00:00"
# 省略日期则默认今天
python3 check.py conf/tasks/switch.conf "08:00:00" "12:00:00"| 机制 | 说明 |
|---|---|
| 状态保存 | 按任务文件名独立保存至 STATE_DIR(默认系统临时目录) |
| 首次运行 | 无状态记录时,默认拉取过去 FALLBACK_TIME_WINDOW 秒的日志 |
| 间隔保护 | 两次运行间隔小于 MIN_TIME_WINDOW 时,强制使用最小窗口 |
| 日志采样 | 单设备日志超过 LOG_SAMPLE_THRESHOLD 时,保留前 LOG_SAMPLE_HEAD 条 + 后 LOG_SAMPLE_TAIL 条 |
| 故障隔离 | 严格区分 Loki 查询失败与无告警日志,分别推送不同级别的通知 |
以 Nginx 错误日志分析为例,3 步完成:
1. 新建 conf/tasks/nginx.conf:
INCLUDE=../global.conf
REPORT_TITLE=【Nginx 异常分析】
REPORT_TAG=nginx_ai_ops
LOGQL_ERRORS={job="nginx", level="error"}
LOGQL_5XX={job="nginx", status=~"5.."}
AI_PROMPT_TEMPLATE="""你是一名 Nginx 运维专家。分析以下异常日志:
{combined_context}
按以下结构输出:
1. 错误分布时间轴
2. 根因分析
3. 排查建议"""2. 运行:
python3 check.py conf/tasks/nginx.conf3. 完成。公共配置自动复用,无需重复填写 LLM、采样等参数。
send/目录下必须存在__init__.py,否则无法动态加载发送模块- 所有 LLM 渠道需兼容 OpenAI
/v1/chat/completions协议 *.env文件包含密钥,已在.gitignore中排除