跳到主要内容

请求日志输出

配置

当前暂时仅支持配置日志输出目标,更细维度的日志输出配置正在准备中。

输出字段

  • ts:请求到达 Aidy 时的时间戳(毫秒级)
  • route_id:原样输出 route 中配置的 id
  • route_name:原样输出 route 中配置的 name
  • route_labels:原样输出 route 中配置的 labels(自定义标签)
  • request_id:请求 ID
  • request:Aidy 入口请求的信息
    • request.url:Aidy 入口请求的 URL(注:该字段当前不包含请求的 scheme、host 和 port 信息,但未来可能会追加成完整 URL,请做好兼容)
    • request.path:Aidy 入口请求的路径
    • request.method:请求方法
    • request.header:请求 header
      • request.header.names:请求 header 的名称列表
      • request.header.values:请求 header 的值列表
    • request.body:请求 body
    • request.chat_model:请求的 chat model(仅当请求是 /chat/completions 接口时,该字段存在)
  • response:Aidy 出口响应的信息
    • response.code:响应码
    • response.header:响应 header
      • response.header.names:响应 header 的名称列表
      • response.header.values:响应 header 的值列表
    • response.body:响应 body
  • upstream.request 对上游的请求相关信息(当未请求到上游时,包含向网关的请求信息,请看下面文档的详细说明)
    • upstream.request.url:请求 URL
    • upstream.request.path:请求 path
    • upstream.request.method:请求方法
    • upstream.request.header:请求 header
      • upstream.request.header.names:请求 header 的名称列表
      • upstream.request.header.values:请求 header 的值列表
    • upstream.request.body:请求 body
    • upstream.request.guard:请求的 guard 检测结果
    • upstream.request.chat_model:请求的 chat model(仅当请求是 /chat/completions 接口时,该字段存在)
  • upstream.response 上游返回的响应相关信息
    • upstream.response.code:响应码
    • upstream.response.header:响应 header
      • upstream.response.header.names:响应 header 的名称列表
      • upstream.response.header.values:响应 header 的值列表
    • upstream.response.body:响应 body
    • upstream.response.chat_completions_body:当请求 /chat/completions 接口时,存储响应 body 的规范化结果(注:当响应体为 SSE 流式响应时,该字段存储流响应被重组后的结果)
    • upstream.response.guard:响应的 guard 检测结果
  • remote_addr:请求的来源地址
  • timing 请求处理过程中的(内部)耗时(时间点)信息(具体请参考 Timing 说明
  • duration 请求处理过程中的(内部)耗时(时间段)信息(具体请参考 Timing 说明
  • error:请求处理过程中的(内部)错误信息

remote_addr

remote_addr 字段记录了请求的来源地址,其格式可能为 IPv4 或 IPv6 地址。在异常情况下,该字段可能为空。

默认情况下,该字段仅记录直连 Aidy 的网络连接的目标地址。如果 Aidy 部署在反向代理之后,该 IP 地址将不能反应真实的来源地址,需要进行配置,请阅读 Remote Addr 文档。

request.chat_model & upstream.request.chat_model

chat_model 字段记录了请求的 chat model。该字段仅当请求是 /chat/completions 接口时存在。

request.chat_model 记录的是用户所请求的 chat model

upstream.request.chat_model 记录的是 Aidy 请求上游时所使用的 chat model(当未配置模型映射规则时,该字段与 request.chat_model 相同)

备注

请注意,即使在请求 /chat/completions 接口时,某些异常情况下(例如请求并未使用合法的 json 字符串),该字段也可能不存在,请做好兼容。

upstream.response.chat_completions_body

当请求的是 /chat/completions 接口时,Aidy 会自动对于 response body 进行规范化处理,并存储到 response.chat_completions_body 字段中。

目前的规范化处理主要针对流式请求,会将流式请求的 SSE 响应体重组成单一 json,而对于非流式请求则基本不做处理。

当规范化处理失败时,Aidy 不会输出错误也不会阻止响应返回到客户端,而是会以 {"error": "error message"} 的形式记录在 response.chat_completions_body 中。

upstream.request.guard & upstream.response.guard

guard 字段记录了请求/响应基于 Guard 的检测结果。该结果仅当对应的检测开启时才会存在。其内容包括

  • context:检测上下文,与检测时 Guard 的配置相同
  • error:检测过程中出现的错误信息
  • 其他字段:guard API 的输出(原样保留)

备注

隐藏敏感信息

Aidy Gateway 默认会隐藏日志中的敏感信息(如 API 密钥)。

可通过静态配置文件关闭(不提供 CLI 开关):

[plugins.log]
hide_sensitive_data = false

当开启隐藏敏感信息时,请求 Aidy 与转发至上游请求所使用的 API 密钥将被全部或部分隐藏。

禁用日志上报

目前存在禁用日志上报的能力,但禁用仅限于关闭最后的「上报」过程,暂时并不能规避中间的处理成本,且所有日志的相关配置仍然需要指定。

最大存储的请求/响应体长度

可利用(某个配置)进行配置。

非 JSON 响应

当非流式响应且其请求或响应体格式不是 JSON 时,仅当开启(某个配置)时,会记录请求/响应体。

未知路径

当请求的 URL 匹配到路由,但不是已知的 AI path 时,可开启(某个配置)以记录日志输出。

注意:仅当开启路由 capabilities 中的 forward-unknown 能力(或兼容的旧配置 allow_unknown_routes)时,才会向上游转发未知路径;否则会直接返回 404 响应。

未知路由

当请求的 URL 未能匹配任何路由的 prefix 时,会对请求响应 HTTP 441。

当开启 log_unknown_routes 配置时,对于未知路由会以 route-id 为 :unknown 输出日志。

危险

在开启 log_unknown_routes 配置时,在某些情况下(如遇到扫描),可能会生成大量垃圾日志,以至于影响系统的整体效率。

建议:不要默认开启该配置,而是仅在有限条件下定时开启该配置。

Embeddings 响应体

对于 /v1/embeddings 接口,当响应为成功(状态码在 200-299)时,日志将省略 response.bodyupstream.response.body 字段;当响应为错误(非 2xx)时,仍会正常记录响应体,以便排查问题。其他字段如 codeheader 一律正常记录。

授权失败

当请求的 URL 未能通过授权认证时,会对请求响应 HTTP 401。

当开启 log_unauthenticated_routes 配置时,对于未经授权的请求会记录日志。

危险

在开启 log_unauthenticated_routes 配置时,在某些情况下(如遇到扫描),可能会生成大量垃圾日志,以至于影响系统的整体效率。

建议:不要默认开启该配置,而是仅在有限条件下定时开启该配置。