
服务出故障时,最棘手的不是找不到日志,而是日志铺天盖地却无法串联。
一次接口报错的同时,数据库连接池等待、SQL 超时、网关 500、缓存重试可能同时出现在不同行里。每条都在”说话”,却彼此互不关联。排查时需要先筛出异常,再沿着时间戳、请求 ID 和服务调用关系,把碎片化的日志拼成完整链路。
定位 ERROR 关键字并不困难。真正的挑战在于:这些错误是否属于同一条故障链?哪一个离根因最近?应该先排查连接池、慢 SQL 还是网关?更关键的是,每一步判断能否回溯到原始日志行。
这个项目想验证的,并非”大模型能否解释日志”,而是它能否真正进入一条可落地的排障流程。

工具定位:AI 输出线索,不下结论
如果直接把原始日志丢给模型并追问”哪里有问题”,得到的大概率是一段流畅的自然语言。它听起来很完整,却很难回答三个关键问题:每一条结论对应的是哪一行原始日志?哪些是日志中客观存在的事实,哪些只是模型的推测?后续该执行哪些具体的排查动作?
基于这个思路,工具的输出被约束为五个部分:总体摘要与整体风险等级、异常类型与对应服务及置信度、逐字摘自原始日志的证据、明确标注为”推测”的可能原因、具体的排查动作以及重复模式和待补充信息。
当日志中没有明显异常时,模型应当返回空的异常数组,而不是为了凑满页面而凭空编造故障。输入过长时,程序会主动在本地截断并追加标记,提醒使用者当前结论只覆盖部分内容。
实际的处理流程如下:

上传 .log/.txt/.json 或粘贴日志
-> 本地读取并兼容常见编码
-> 保留行号,提取时间和日志级别
-> 控制送模文本长度
-> 调用蓝耘 MaaS
-> 校验结构化 JSON
-> 展示异常、证据、推测和排查动作
-> 查看或导出原始 JSON
程序首页保持简洁,支持文件上传和直接粘贴两种输入方式。
选型与接入:为什么用蓝耘 MaaS
开发日志分析工具时,模型只是整条链路中的一个环节。真正决定落地效果的,反而是几件看起来不那么”智能”的事情:模型是否方便选型、现有代码能否低成本接入、密钥能否独立管理、长日志的调用成本是否透明。
这正是引入蓝耘 MaaS 的原因。它的模型广场把不同提供方、模型类型、上下文长度和价格信息集中到一个控制台里。选定模型后,通过统一的 API 方式就能嵌入应用。对于已经在用 OpenAI Python SDK 的项目,业务代码不需要围绕专用 SDK 重写,只要配置 Base URL、API Key 和模型名,就能把调用放进现有流程。

这次实测选择了 qwen3.7-plus。它是 Qwen3.7 系列中的高性价比 Plus 模型,具备视觉理解能力和 1024k 上下文。日志助手目前使用的是它的文本理解、归纳和结构化输出能力;视觉能力则可以为后续分析监控截图、告警截图等图文输入留下扩展空间。
控制台直接展示了分段计费信息:输入价格 2 元/M tokens,输出 8 元/M tokens,缓存命中输入 0.4 元/M tokens。对于日志分析这种输入长度可能较大的工具来说,能在选型阶段就把上下文窗口和价格看清楚,有助于同时权衡能力与成本。
API Key 在蓝耘控制台的”API KEY 管理”页面创建,平台也明确提示妥善保存密钥、不要公开分享。处理方式是把 Key 只写入本地 .env,代码中不出现真实值。
所以,蓝耘在这里的角色远不止一个被动回答的接口——它连接了”模型选型”和”应用开发”两个环节:前面可以按能力、上下文和价格筛选模型,后面可以用熟悉的 SDK 接入,密钥则与业务代码分离。模型广场中还有其他模型可选,也为后续做模型对比或按任务切换选型留出了空间。本文仅实测了 qwen3.7-plus,不据此评价其他模型。
核心代码:业务层不需要大改

项目使用 Flask 提供本地 Web 页面,用 OpenAI Python SDK 调用蓝耘 MaaS。核心配置集中在 .env:
BLUEYUN_API_KEY=你的蓝耘API密钥
BLUEYUN_BASE_URL=
BLUEYUN_MODEL=qwen3.7-plus
BLUEYUN_JSON_MODE=true
MAX_LOG_CHARS=30000
安装依赖并启动:
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python app.py
浏览器打开 http://127.0.0.1:5000 即可使用。

模型调用被收拢在一个函数中。蓝耘提供 OpenAI 兼容端点,实际请求由 SDK 发往 /chat/completions:
client = OpenAI(
api_key=API_KEY,
base_url="",
timeout=180.0,
)
response = client.chat.completions.create(
model="qwen3.7-plus",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": f"请分析以下日志:\n\n{log_text}"},
],
response_format={"type": "json_object"},
temperature=0.1,
max_tokens=4000,
)
提示词要求模型只基于给定日志进行分析,证据必须逐字摘录,输出字段固定为 summary、overall_level、anomalies、repeated_patterns 和 missing_context。
程序不会把模型返回的任意文本直接当作”成功结果”展示。它会先解析 JSON,并校验 anomalies 是否为数组。调用失败、JSON 解析错误或字段不符合约定时,接口都会明确报错。这一步把模型能力纳入了一个受程序约束的工作流,而不是让它停留在页面背后的聊天框里。
五组实测日志

准备了五组用途不同的输入,分别验证:已知异常能否串成故障链、正常日志是否会被误判、重复错误能否归并、超长输入能否暴露边界、跨服务事件能否被拆开。
五组日志全部通过蓝耘 MaaS 的 Qwen3.7-Plus 完成实际调用。下表中的耗时来自页面运行结果,仅反映本次样例、网络和运行环境,不构成性能基准。
| 样例 | 日志行数 | 调用耗时 | 主要验证点 | 实际结果 |
|---|---|---|---|---|
| 已知异常基线 | 8 | 34444 ms | 数据库、网关和缓存异常 | 输出 4 类异常,并保留原文证据 |
| 仅 INFO 日志 | 12 | 14725 ms | 是否会强行编造故障 | 未输出异常项,判断系统整体健康 |
| 重复错误日志 | 15 | 36450 ms | 能否归并重复事件 | 归纳为连接池耗尽、查询超时和 API 失败 |
| 超长日志 | 420 | 17953 ms | 长度边界与信息缺失提示 | 未发现已读取片段中的错误,并提示日志被截断 |
| 脱敏生产风格日志 | 17 | 42047 ms | 多服务事件链与结构化导出 | 识别认证、超时、熔断和订单失败事件 |
1. 已知异常:从八行日志还原故障链
第一组日志只有八行,但同时包含数据库连接池等待、两次数据库超时、两次 /orders 接口 500,以及一次 Redis 连接重试。

模型给出的总体级别为”高”,摘要指出数据库连接池耗尽导致 order.service 多次数据库超时,并引发 /orders 接口 500,同时观察到 Redis 重试。页面进一步拆出了四类异常:数据库连接池耗尽、数据库超时、接口 500 错误、Redis 连接重试。
最有价值的不是异常名称本身,而是证据可以回到原文。例如连接池问题引用了 pool wait exceeded threshold wait_ms=812 active=20 idle=0,接口错误引用了两个请求的 route=/orders status=500。可能原因前保留了”推测”字样,排查动作则落到了连接池配置、慢查询、数据库负载、接口错误率和熔断降级等具体方向。
结果页下方还展示了重复模式、待补充信息和原始 JSON。模型指出数据库超时后紧跟 /orders 500,并建议进一步补充数据库慢查询日志、连接池参数、Redis 后续状态和流量变化等信息。
2. 仅 INFO 日志:验证模型能否克制输出
第二组共 12 行,全部为 INFO,覆盖网关、订单、支付、缓存、数据库连接池、指标上报和健康检查。各项状态均为成功或正常。

模型没有为了”完成分析”而生成异常卡片,而是给出低级别摘要:各服务运行正常,没有错误或异常指标,系统整体健康。页面耗时为 14725 ms。
这组测试很有必要。日志助手如果只能在错误样例里找问题,却会把正常日志误写成故障,那么它在真实工作流中反而会制造额外噪声。
3. 重复错误:把多行报错归并为事件模式
第三组日志模拟数据库连接池逐步耗尽的过程:idle 降为 0,waiting 从 4 增长到 9;相同的 find_orders 查询连续超时,随后 /orders 多次返回 500;最后连接池恢复为 idle=8, waiting=0。
模型没有把每一行都拆成一个独立问题,而是归并为三类异常:数据库连接池耗尽、数据库查询超时和 API 请求失败。它还注意到了最后的恢复状态,并建议检查 find_orders SQL 执行计划与耗时、数据库慢查询、连接池最大连接数和该时段流量。

这种结果更接近实际排障需要。使用者看到的是一条关于”连接池等待、查询超时、网关失败”的关联链,而不是十几条彼此割裂的错误复述。
4. 超长输入:主动暴露分析边界
第四组日志共 420 行,原始文件约 5 万字符。程序在预处理时加入行号、时间和级别标记,并按 MAX_LOG_CHARS=30000 控制送入模型的正文长度。
模型在已读取内容中没有发现错误:日志均为 INFO、状态码为 200、延迟稳定在 24 ms。与此同时,它在”待补充信息”中明确指出日志被截断,缺少后续是否存在错误日志的信息,也缺少其他服务或模块的日志来确认整体状态。
这种边界意识是值得保留的:对截断后的局部日志,工具可以总结已经看到的内容,但不能据此宣称全量日志都正常。

5. 脱敏生产风格日志:识别跨服务事件链
第五组是完全虚构且已脱敏的生产风格日志,共 17 行。它包含两条主要事件链:一条是同一测试用户连续三次签名校验失败后被临时封禁;另一条是库存服务先出现高延迟,随后两次超时,熔断器打开,订单创建失败并由网关返回 503,之后熔断器进入半开状态并恢复关闭。
模型输出了认证失败、服务超时、熔断触发和订单创建失败等异常,并分别保留了日志证据。以认证失败为例,证据包含三次 invalid_signature 和 temporary_block;排查动作包括检查客户端签名配置、确认测试用户凭证状态和监控该 IP 的后续行为。
对于库存链路,模型将高延迟和两次超时归入服务异常,同时把熔断器 state=OPEN 单独识别出来,并建议检查服务健康状态、资源使用、网络链路和依赖服务日志。诸如”负载过高””网络延迟或丢包”只是待验证的可能原因,不能直接当成根因结论。
结构化输出:从页面到 JSON

页面展示适合人阅读,JSON 则适合进入后续流程。工具保留了”查看原始 JSON”区域,并提供”导出 JSON”按钮。第五组样例导出后,可以看到每条异常均包含 actions、confidence、evidence、level、possible_causes、service 和 type 等字段。
结构化结果意味着这份 Demo 后续可以继续扩展,例如把高风险项推送到告警系统、把排查动作写入工单、按服务聚合历史问题,或者加入人工确认状态。本文没有实现这些功能,但当前输出已经不再局限于一次性的聊天回答。
复盘:价值落在三个节点
跑完五组样例之后,这套方案的价值不只发生在”发送请求、收到回答”的几秒钟里,而是落在三个具体节点:选型时,模型广场把能力标签、上下文长度和价格放在同一个界面里;接入时,OpenAI 兼容端点让现有 Python SDK 可以直接进入项目;运行时,qwen3.7-plus 承担日志语义理解、异常归并和结构化输出。
与此同时,本地程序与模型服务的职责保持分开:本地程序负责文件读取、编码兼容、日志编号、长度限制、JSON 校验、页面展示和结果导出;蓝耘 MaaS 的 qwen3.7-plus 负责理解日志语义、归并异常、摘取证据,并生成可能原因和排查动作。
这种分工提供了一种稳定的边界。蓝耘提供的是模型能力和接入方式,程序负责约束输入输出,人负责确认根因。三者各自守住边界,模型的语义理解才不会变成一段无法审计的长回答。
五组实测也从侧面验证了这套组合:异常日志能形成排查链,正常日志没有被强行制造故障,重复日志可以归并,超长日志会暴露信息不完整,复杂日志则能按服务和事件拆分。对于希望把大模型嵌入现有工具的开发者,蓝耘缩短的正是从”选到一个模型”到”让它进入业务流程”之间的距离。
结语
回到开头那 8 行日志。
它们原本只是连接池等待、数据库超时、网关 500 和 Redis 重试。经过本地预处理与蓝耘 MaaS 的分析,它们被整理成了一条可以继续行动的路径:异常是什么,证据在哪里,哪些只是推测,下一步查什么,还缺少哪些信息。
这套组合把模型能力、上下文与价格信息、API 接入和密钥管理放进同一个平台,让开发者可以把精力放回问题本身,而不是停在接口适配和一次性演示上。
日志排障不需要大模型替代工程师。只要能把分散的日志整理成有证据、有边界、可复核的排查线索,这套方案就已经找到了自己的位置。