日志管理
AI Gateway 提供了详细的日志记录,包括 Agent 交互日志、API Key 用量统计和 Gateway 请求日志。这些日志存储在 MongoDB 中,便于监控、调试和审计。Agent 原始请求和响应
在 MongoDB 中,我们使用agent_logs 集合来存储 Agent 的完整交互日志,包括用户请求、AI 响应、性能指标等关键信息。
数据结构详解
字段详细说明
基础信息字段
- _id: MongoDB 自动生成的唯一标识符,使用 ObjectId 格式
- timestamp: 请求开始时间,ISO 8601 格式的 UTC 时间戳
- finished_at: 请求完成时间,用于计算总耗时
- duration_ms: 请求总耗时(毫秒),从接收到响应的完整时间
- user_id: 发起请求的用户唯一标识符
- username: 用户的显示名称,便于人工识别
- agent: 使用的 Agent 类型(如 dify、langchain 等)
- path: 请求的路径端点,标识 API 路由
请求详情字段
- request: 包含用户请求的完整信息
- query: 用户的实际输入文本或问题
- user: 用户标识符,可能与 username 相同
- uid: 预留的用户唯一标识字段,当前为 null
- stream: 是否启用流式响应(true/false)
- app_id: 关联的应用程序 ID
- chat_id: 聊天会话标识符
- files: 上传的文件列表(数组格式)
- conversation_id: 对话历史标识符,用于上下文保持
- detail: 是否返回详细信息
原始响应字段
- raw_response: Agent 返回的原始响应数据
- event: 事件类型(如 message、error 等)
- task_id: 任务唯一标识符,用于追踪
- id/message_id: 消息唯一标识符
- conversation_id: 对话会话标识符
- mode: 运行模式(如 advanced-chat、completion 等)
- answer: AI 的实际回复内容
- metadata: 元数据信息
- annotation_reply: 注释回复(预留字段)
- retriever_resources: 检索到的相关资源列表
- usage: 用量统计
- prompt_tokens: 输入文本的 token 数量
- prompt_unit_price: 输入 token 的单价
- prompt_price_unit: 价格单位(每百万 token)
- prompt_price: 输入部分的总价格
- completion_tokens: 输出文本的 token 数量
- completion_unit_price: 输出 token 的单价
- completion_price_unit: 价格单位(每百万 token)
- completion_price: 输出部分的总价格
- total_tokens: 总 token 数量(输入+输出)
- total_price: 总费用(输入+输出)
- currency: 货币单位(RMB/USD 等)
- latency: 实际处理延迟(秒)
- created_at: 消息创建时间戳(Unix 时间戳格式)
格式化响应字段
- formatted_response: 标准化后的响应格式,兼容 OpenAI API 格式
- id: 响应唯一标识符
- model: 使用的模型名称
- usage: 用量统计(简化版)
- prompt_tokens: 输入 token 数
- completion_tokens: 输出 token 数
- total_tokens: 总 token 数
- choices: 响应选项列表
- message: 消息内容
- role: 角色标识(assistant/user/system)
- content: 实际消息文本
- finish_reason: 结束原因(stop、length、content_filter 等)
- index: 选项索引
- message: 消息内容
控制字段
- detail: 是否启用详细日志记录
- stream: 是否启用流式响应模式
API Key 用量统计
在 MongoDB 中,我们使用api_key_stats 集合来存储API Key的用量统计信息,用量数据包括当前使用的 key,以及今天和本月的用量统计数据,以及重置日期。
数据结构详解
字段详细说明
基础标识字段
- _id: MongoDB 自动生成的唯一标识符,用于记录此条统计信息
- api_key_id: 关联的 API Key 的唯一标识符(ObjectId),指向具体的 API Key 记录
用量统计字段
- total_calls: 该 API Key 的累计调用总次数,从创建开始的完整统计
- calls_today: 当日调用次数,每日零点自动重置为 0
- calls_this_month: 当月调用次数,每月第一天零点自动重置为 0
时间相关字段
- last_used_at: 最后一次使用该 API Key 的时间戳,精确到毫秒
- last_reset_date: 日调用次数的最后重置日期,格式为 YYYY-MM-DD
- last_reset_month: 月调用次数的最后重置月份,格式为 YYYY-MM
重置机制说明
- 日重置:每日 UTC 时间 00:00:00 自动将
calls_today重置为 0,并更新last_reset_date - 月重置:每月第一天 UTC 时间 00:00:00 自动将
calls_this_month重置为 0,并更新last_reset_month - 这些重置操作由系统自动完成,无需人工干预
Gateway 请求日志
在 MongoDB 中,我们使用request_logs 集合来存储Gateway的请求日志信息,包括请求的URL、请求的参数、请求的响应等。这些日志用于监控 API 性能、排查问题和安全审计。
数据结构详解
字段详细说明
基础信息字段
- _id: MongoDB 自动生成的唯一标识符,用于记录此条请求日志
- timestamp: 请求到达网关的时间戳,ISO 8601 格式的 UTC 时间
HTTP 请求字段
- method: HTTP 请求方法(GET、POST、PUT、DELETE、PATCH 等)
- path: 请求的路径端点,不包含域名和查询参数
- query: URL 查询参数对象,键值对格式(如
{"page": 1, "limit": 10}) - ip: 客户端 IP 地址,用于地理位置分析和安全监控
- user_agent: 客户端用户代理字符串,标识客户端类型和版本信息
- content_length: 请求内容长度(字节),用于监控请求大小
身份认证字段
- user_id: 已认证用户的唯一标识符,未认证时为 null
- username: 已认证用户的用户名,未认证时为 null
- auth_type: 认证类型(如 bearer、api_key、basic、session 等),未认证时为 null
- api_key_id: 使用的 API Key 标识符(ObjectId),未使用 API Key 时为 null
- agent: 使用的 Agent 类型标识符,用于区分不同的 AI 服务
响应信息字段
- status_code: HTTP 响应状态码,用于判断请求是否成功
- 2xx: 成功响应
- 3xx: 重定向
- 4xx: 客户端错误
- 5xx: 服务器错误
- duration_ms: 请求处理耗时(毫秒),从接收到返回的完整时间
- response: 响应内容摘要或错误信息,成功时可能为 null
- is_streaming: 是否为流式响应(true/false),用于区分普通响应和 SSE 流
追踪字段
- trace_id: 分布式追踪 ID,用于跨服务请求链路追踪,便于问题定位
日志用途说明
监控用途
- 性能监控: 通过
duration_ms监控 API 响应时间 - 流量监控: 通过
timestamp和path分析 API 调用频率 - 错误监控: 通过
status_code识别异常请求模式
安全用途
- 访问审计: 通过
ip、user_id、api_key_id追踪用户行为 - 异常检测: 识别异常的
user_agent或频繁的 4xx/5xx 错误 - 限流控制: 基于
ip或api_key_id实施访问频率限制
调试用途
- 问题定位: 通过
trace_id追踪完整请求链路 - 性能优化: 分析慢查询和高延迟请求
- 错误分析: 结合
response和status_code排查具体问题
日志系统架构总结
数据流向
日志关联关系
- request_logs 记录所有进入网关的请求,包括认证失败的请求
- agent_logs 记录成功的 AI 交互,包含完整的对话上下文
- api_key_stats 记录 API Key 的使用统计,与 request_logs 通过
api_key_id关联
