日志与审计
控制面为运维人员提供两类证据链:用于 AISIX 网关流量的请求日志,以及用于控制面状态变更的审计日志。两者结合起来,可以帮助团队了解一次请求发生了什么,以及是谁修改了影响流量的资源。
使用请求日志排查具体的 AISIX 网关请求;使用审计日志排查配置、访问权限和其他控制面变更。
请求日志
请求日志基于 AISIX 网关遥测数据生成。它展示单个请求的结果,包括请求时间、状态、请求模型、调用方 API Key、延迟、Token 数量,以及可用时的尝试详情。延迟会从两个角度报告:调用方等待了多久,以及上游处理花费了多久。这样无需猜测即可判断慢请求的延迟来源。
展开一行会看到 AISIX 分配的 请求 ID;如果这次调用到达了会返回 ID 的服务提供方,旁边还会有一个 服务商请求 ID。二者含义不同:前者由 AISIX 通过 x-aisix-request-id 响应头返回给 调用方,也是报障的调用方通常手上有的 ID;后者是上游服务提供方为这次调用给出的 ID,例如 OpenAI 的 chat.completion.id、Anthropic 的消息 id 或 Gemini 的 responseId;响应本身不带 ID 时,则是服务提供方的请求 ID 响应头,例如 Amazon Bedrock 的 x-amzn-requestid。服务提供方的控制台和技术支持渠道正是按它检索这次调用的。先用前者查到该请求,再从中读取后者,然后拿它去找服务提供方。
如果本次调用没有产生服务提供方请求 ID,该字段不会显示:包括响应由缓存命中返回、请求在 AISIX 到达服务提供方之前就被拒绝,以及服务提供方的响应既不带 ID 也不带请求 ID 响应头。失败的尝试、Token 计数、向量嵌入、音频和图像生成会记录响应头中的 ID。重试或故障转移的请求会按拿到响应的尝试各记录一个,因此请展开实际向调用方返回响应的那次尝试,或你要向服务提供方反馈的那次失败尝试。
一行的 Token 数:上游为该尝试上报了总数时取该总数,否则取提示词、补全、缓存创建和缓存读取计数之和。展开该行后,上报的总数显示为 Total tokens (reported by upstream)(上游报告的 Token 总数);没有上报总数的行不显示这一项。计数按上游上报的原样记录,因此某些行的推理 Token 可能多于补全 Token。详见按上报原样记录计数。
带有 estimated 标记的行包含一个或多个本地计算的 Token 数量,因为上游响应省略了这些值或将其报告为零。这种情况可能出现在 OpenAI 兼容中继、客户端在流式传输中途断开,以及上游返回部分响应后出错时。估算的 Token 数量会与服务提供方报告的数量一起计入支出和预算计 算。排查用量或支出时,可以通过该标记区分估算值。有关支持的端点和估算行为,请参阅用量上报。

展开一行还会显示调用方 API Key 绑定的 团队,以及请求运行时归属的成本归属标签 标签。请求日志不提供标签筛选。要按标签拆分用量,请使用 成本分析,其中的 API Key 行可以打开本页面并按该 Key 筛选。
上游报告了其实际处理请求所用的服务档位时,展开的行会将其显示为 服务档位,使用服务提供方自己的词汇,例如 OpenAI 的 fast mode 为 priority。服务档位价格按这个值匹配。参见读取实际服务档位。
展开的行还会显示 平台成本,即该次尝试的用量按目标模型自身价格计算的成本;由阶梯费率决定成本时还会显示 价格阶梯。参见读取平台成本和价格档。计费明细 列出输入、缓存读取、输出等各计费项按其单价计算的金额以及低峰折扣,参见单次请求的计费明细。
数据面会批量刷新遥测数据,因此刚完成的请求可能需要几秒才会出现。
每行都会显示本地日期和时间,因此跨越多天的时间范围仍易于阅读。将鼠标悬停在时间戳上可查看包含时区的完整日期和时间。
当需要验证实时请求、检查上游错误、确认策略拒绝,或查看路由与故障转移如何解析请求时,请先查看请求日志。
解读延迟数据
请求日志行会显示调用方等待的时间。展开该行可以查看拆分后的测量值,因为单个数字无法判断慢请求是由服务提供方还是网关造成的:
| 字段 | 测量内容 | 范围 |
|---|---|---|
| 调用方延迟 | 从网关收到请求,到完成非流式响应或开始发送流式响应。 | 整个请求,包括每次重试和故障转移尝试。 |
| 上游延迟 | 实际处理该请求的尝试与服务提供方通信所花费的时间。 | 一次尝试。 |
| 上游首字延迟 | 该尝试等待服务提供方首个流式帧的时间,无论帧内容为何——包括 response.created、message_start 等元数据起始帧。仅适用于流式请求。 | 一次尝试。 |
讨论 SLO 时应引用调用方延迟;概览 页面中的 延迟 p50 / p99 卡片也使用该指标。
上游 TTFT 在流的首个帧到达时停止计时,而不是首个可见 Token。这与部署在 AISIX 前面的代理和网关的统计口径一致,因此该值可以与它们记录的数据直接对比。如果推理模型在思考期间不输出任何可见内容——例如 /v1/responses 上游会立即打开流、但不输出推理摘要——那么即使回答文本很晚才开始,TTFT 也会很小;这段思考等待计入上游延迟,而不是 TTFT。
对于流式响应,调用方延迟会在流开始时停止计时,而不是等到流结束。流的总持续时间会随模型生成的 Token 数量增加,无法有效反映用户体验;用户真正感知的是输出开始出现前的等待时间。
比较这些字段可以定位延迟。如果请求未重试,而调用方延迟远高于上游 TTFT,说明时间花在网关侧处理上。常见原因是执行脱敏的输出安全护栏:它必须缓冲完整响应流后才能释放内容。如果两者接近,则主要耗时来自服务提供方。对于发生重试或故障转移的请求,差值还包含先前的尝试,因此应先查看尝试记录。
延迟 p50 / p99 卡片只统计成功请求。被拒绝的请求通常很快,正是因为系统没有执行多少处理;如果将其计入,会拉低百分位数并掩盖实际的慢请求。对于上游中断或超时等情况,在 200 响应头发出后失败的流式响应会记录相应的失败状态,因此不算成功。输出安全护栏在 200 响应头发出后拒绝内容时,记录的状态仍为 200;分析此类记录时,还应检查 guardrail_blocked 和 error_class,不能只凭 200 判定成功。参见响应头发出后失败的流和用量日志记录了什么。
该卡片的百分位数是近似值。控制面从小时级用量汇总中计算它们:每个延迟值被归入对数分桶,每个桶比下一级宽约 10%,因此报告的 p50 或 p99 与同一批请求的精确百分位数相差约 5% 以内。概览 页面上的其他数字(如请求数和 Token 数)是同一汇总中的精确求和。
解读护栏命中
展开一条请求可以看到运行过的护栏以及每个护栏的处理结果。执行命中 列出 block 模式下护栏实际执行的动作,监控命中 列出 monitor 模式下护栏本应执行的动作:
| 区域 | 标签 | action | 含义 |
|---|---|---|---|
| 执行命中 | 已改写 | masked | 内容已脱敏,请求继续处理。 |
| 执行命中 | 已拦截 | blocked | 护栏策略拒绝了该内容。 |
| 执行命中 | 检查不可用 | blocked_unavailable | 护栏无法评估该内容,且其失败策略拒绝无法检查的内容。 |
| 执行命中 | 已拦截:超出缓冲上限 | blocked_buffer_exceeded | 被保留的流式响应超出输出缓冲上限,未经扫描即被拒绝。该命中指明 max_buffer_bytes 被触及的护栏。 |
| 执行命中 | 命中,未脱敏 | mask_unsupported | 脱敏规则在无法改写内容的 路由(例如透传路由)上命中,内容不经修改地返回。 |
| 监控命中 | 本应拦截 | would_block | 护栏本应拒绝该内容。 |
| 监控命中 | 本应脱敏 | would_mask | 护栏本应对该内容脱敏。 |
| 监控命中 | 本应命中,无法脱敏 | would_mask_unsupported | 脱敏规则在无法改写内容的路由上命中,因此强制执行该规则同样不会脱敏任何内容。 |
绕过原因 在内容未经某个护栏判定就被放行时显示原始失败标记。除护栏类型自身的失败标记外,它还可能是 unscannable_body(AISIX 无法读取的内容),或 output_buffer_exceeded(在 on_buffer_exceeded: fail_open 下未经扫描放行的被保留流)。参见安全护栏行为。
区分策略拦截与故障拦截
护栏拦截 标签页列出所有被护栏拒绝的请求。其 拦截类型 筛选器区分两类拒绝:策略拦截,即护栏根据内容拒绝了请求;故障拦截,即没有护栏得出判定(例如其服务商不可用),且护栏配置为拒绝而非放行。筛选器默认显示 全部拦截,每条被拦截的记录都带有 策略拦截 或 故障拦截 标记。从该标签页发起的导出会应用同一筛选条件。