学习 LiteLLM 的日志系统

对于一个 LLM 网关来说,日志系统扮演着至关重要的角色:它不仅能帮我们追踪每一笔 API 调用的成本和性能;当模型回复异常或请求失败时,还能提供详细的上下文信息来定位问题;它还确保所有管理操作都有迹可循,以满足合规性要求。

我们今天就来学习下 LiteLLM 的日志体系,主要包括 请求日志(Spend Logs)会话日志(Session Logs)审核日志(Audit Logs)

请求日志

请求日志(Spend Logs) 是整个日志系统的核心,它记录了每一次 API 调用的详细信息,包括调用者、消耗成本、token 使用量、延迟等关键指标,能够用于成本分析和性能监控。

可以进入 Admin UI,点击 Logs 菜单,查看请求日志:

在这里,LiteLLM 记录了所有成功和失败的请求日志。考虑到 隐私保护存储成本,默认情况下,LiteLLM 只记录元数据信息,而不存储具体的请求和响应内容。如果业务需要进行内容分析或调试,可以通过下面的配置显式开启:

yaml 复制代码
general_settings:
  store_prompts_in_spend_logs: true

注:开启此选项会增加数据库的存储压力,并且可能涉及敏感数据的合规问题,请根据实际情况谨慎开启。

开启后,你就能在 UI 界面中看到完整的对话内容:

日志保存逻辑

LiteLLM 的请求日志保存在 Postgre 数据库的 LiteLLM_SpendLogs 表中,在高并发场景下,如果每一笔请求都同步写入数据库,会对性能造成巨大影响。为了最小化对主要请求路径的性能影响,它采用了 异步队列和批量处理 的优化手段:

这里有几个值得学习的点:

  1. 异步处理:日志记录不会阻塞主要的 API 响应路径
  2. 批量提交:多个日志记录会被聚合后批量写入数据库
  3. 内存缓冲:使用内存队列减少数据库 I/O 频次
  4. 事务安全:通过数据库事务确保数据一致性

高级配置选项

除了 store_prompts_in_spend_logs 选项之外,LiteLLM 还提供了很多其他的配置选项来控制日志行为:

yaml 复制代码
general_settings:
  # 完全禁用错误日志
  disable_error_logs: true

  # 完全禁用支出日志
  disable_spend_logs: true

  # 存储详细的请求/响应内容
  store_prompts_in_spend_logs: true

  # 配置日志保留期
  maximum_spend_logs_retention_period: "30d"  # 30天后自动删除
  maximum_spend_logs_retention_interval: "1d"  # 每天执行一次清理

其中日志的自动删除功能属于企业特性。此外,在多实例部署环境中,LiteLLM 使用 Redis 分布式锁 确保清理任务不会重复执行,因此需要开启 Redis 缓存。

会话日志

会话日志(Session Logs) 在请求日志的基础上,提供了 会话级别的聚合视图 ,它通过 session_id 将相关的请求进行逻辑分组,让你能够跟踪用户的完整交互流程。

可以在发起请求时增加一个 litellm_session_id 参数:

python 复制代码
response = client.chat.completions.create(
  model="gpt-4o",
  messages=[
    {"role": "user", "content": "你好,我是张三"}
  ],
  extra_body={
    "litellm_session_id": session_id
  }
)
print(response.choices[0].message.content)

然后将后续请求也关联到这个会话:

python 复制代码
response = client.chat.completions.create(
  model="gpt-4o",
  messages=[
    {"role": "user", "content": "你好,我是张三"},
    {"role": "assistant", "content": response.choices[0].message.content},
    {"role": "user", "content": "我是谁"}
  ],
  extra_body={
    "litellm_session_id": session_id
  }
)
print(response.choices[0].message.content)

在 LiteLLM 的 UI 中,可以看到生成的两条请求日志 Session ID 是相同的:

你可以通过 Session ID 筛选出该会话下的所有交互记录,这对于复现 Bug 或分析用户行为模式非常有帮助:

使用 Responses API

使用 Chat Completions API 进行多轮对话时,每一次都要带上完整的上下文,这是非常不方便的。可以考虑使用 OpenAI 的 Responses API 接口,LiteLLM 也对该接口做了兼容。

第一次请求如下:

python 复制代码
response = client.responses.create(
  model="gpt-4o",
  input="你好,我是张三"
)
print(response.output_text)

第二次请求时通过 previous_response_id 参数带上前一次请求的响应 ID 即可:

python 复制代码
response = client.responses.create(
    model="gpt-4o",
    input="我是谁",
    previous_response_id=response.id
)
print(response.output_text)

LiteLLM 内部对 Chat Completions API 接口做了一层封装,使得我们也可以通过 Responses API 调用 Anthropic、Gemini 等模型。不过需要注意的是,它是根据会话 ID 查询数据库获取历史对话,因此需要开启 store_prompts_in_spend_logs: true 保存请求和响应的日志。

另一点需要注意的是,由于日志存储是异步的,因此第二次请求不能太快,太快的话可能还查不到历史对话,两次请求中间要等待个 10 秒左右。这个特性目前还是 beta 状态,后面应该会优化。

审核日志

审核日志(Audit Logs) 则专注于记录所有的管理操作,包括用户创建、权限变更、配置修改等。这类日志对于企业的合规要求、安全审计和问题追踪具有关键作用。

审核日志是企业级特性,需要显式启用:

yaml 复制代码
litellm_settings:
  store_audit_logs: true

然后我们通过 /key/generate 接口生成一个 Key:

bash 复制代码
$ curl 'http://127.0.0.1:4000/key/generate' \
  -H 'Authorization: Bearer sk-1234' \
  -H 'Content-Type: application/json' \
  -d '{
    "models": ["gpt-4o"],
    "metadata": {"user": "audit-test@example.com"}
  }'

进入 Admin UI,点击 Logs 菜单,查看审核日志如下:

LiteLLM 会自动为以下管理操作创建审核日志:

diff 复制代码
用户管理:
- ✅ 用户创建、更新、删除
- ✅ 用户权限变更
- ✅ 用户状态变更(激活/禁用)

API 密钥管理:
- ✅ 密钥创建、更新、删除
- ✅ 密钥轮换(regenerate)
- ✅ 密钥权限修改

团队管理:
- ✅ 团队创建、更新、删除
- ✅ 团队成员添加/移除
- ✅ 团队预算调整

模型配置:
- ✅ 模型添加、更新、删除
- ✅ 模型权限配置变更

小结

今天的内容比较简单,主要学习了 LiteLLM 的三大日志系统:

  • 请求日志(Spend Logs) 精确记录每一次 API 调用的详细信息,可以通过 store_prompts_in_spend_logs 参数开启存储具体的请求和响应内容;
  • 会话日志(Session Logs) 在请求日志基础上提供了会话级别的聚合视图,通过 Session ID 分组,支持跨多个请求的用户行为追踪和对话模式分析;
  • 审核日志(Audit Logs) 专注于管理操作的完整记录,确保每一个关键操作都有迹可循;

这套完整的日志系统,作为 LiteLLM 的核心能力,直接存储在 Postgre 数据库中。其实,LiteLLM 还支持对接很多外部日志系统或可观测平台,并基于这些丰富的日志数据构建完善的监控体系,我们将在下一篇文章中继续学习。

欢迎关注

如果这篇文章对您有所帮助,欢迎关注我的同名公众号:日习一技,每天学一点新技术

我会每天花一个小时,记录下我学习的点点滴滴。内容包括但不限于:

  • 某个产品的使用小窍门
  • 开源项目的实践和心得
  • 技术点的简单解读

目标是让大家用5分钟读完就能有所收获,不需要太费劲,但却可以轻松获取一些干货。不管你是技术新手还是老鸟,欢迎给我提建议,如果有想学习的技术,也欢迎交流!

相关推荐
秋邱42 分钟前
价值升维!公益赋能 + 绿色技术 + 终身学习,构建可持续教育 AI 生态
网络·数据库·人工智能·redis·python·学习·docker
Mintopia44 分钟前
🎭 小众语言 AIGC:当 Web 端的低资源语言遇上“穷得只剩文化”的生成挑战
人工智能·aigc·全栈
安达发公司1 小时前
安达发|告别手工排产!车间排产软件成为中央厨房的“最强大脑”
大数据·人工智能·aps高级排程·aps排程软件·安达发aps·车间排产软件
公众号-架构师汤师爷1 小时前
n8n工作流实战:从0到1打造公众号热点选题一键采集智能体(万字图文)
人工智能·agent·智能体·n8n
Baihai_IDP1 小时前
剖析大模型产生幻觉的三大根源
人工智能·面试·llm
DatGuy1 小时前
Week 26: 深度学习补遗:LSTM 原理与代码复现
人工智能·深度学习·lstm
杜子不疼.2 小时前
光影交织:基于Rokid AI眼镜的沉浸式影视剧情互动体验开发实战
人工智能
IT_陈寒2 小时前
Python高手都在用的5个隐藏技巧,让你的代码效率提升50%
前端·人工智能·后端
love530love2 小时前
【保姆级教程】Windows + Podman 从零部署 Duix-Avatar 数字人项目
人工智能·windows·笔记·python·数字人·podman·duix-avatar