跳到正文
Ankole

审计轨迹

面向 AI Agent:本页的 Markdown 版本位于 https://ankole.agentbull.com/zh-Hans-CN/docs/audit-trail/index.md,文档索引位于 https://ankole.agentbull.com/zh-Hans-CN/llms.txt。

审计轨迹是“谁在何时改了什么”的持久记录。Ankole 没有单一审计日志;它有几个面,各自由不同子系统拥有,各自记录对自己要紧的决定。本页是这些面的运维者地图——各自记录什么、如何读取、如何配合使用。

先说明最关键的一点:每个审计面都是持久 PostgreSQL 状态或结构化日志,不是临时指标。写了的记录熬得过写它的进程;没写的记录无法重建。

AuthZ grant 记录

每个权限授予是 permission_grants 里的一行持久行。grant 的 principal_uid 或 group_id 标明 owner;resource_pattern 和 action 标明允许什么;时间戳记录何时创建和最后更新。grant 没有单独审计日志——grant 表本身就是记录,因为 grant 基本只追加,变更作为行更新可见。

通过 GET /principals/:uid/grants 和 GET /principal-groups/:name/grants 读取 grant。加过又删的 grant 在表历史里可见(若你保持 PostgreSQL 时间点恢复开启);当前存在的 grant 是系统强制的。

结构化控制面日志

控制面输出结构化日志,形态稳定——事件名、说明文字、结构化字段,严重级别从 debug 到 error。这些是运维事件的审计面:

  • provider 调用(哪个 provider、哪个模型、结果)
  • worker 生命周期(worker 启动、回合启动、回合完成或错误)
  • 信号事件(到达了什么、被过滤还是被接受)
  • 调度触发(何时、什么结果)

日志不是 PostgreSQL——它们由你的日志摄入器接收。需要用于审计时,实时发往持久存储(日志索引、S3 归档)。从未外发的日志随进程消失。

日志级别和格式见 环境变量,定位具体故障的方法见 怎样阅读 Ankole 日志。

Actor-event 与 delivery 行

每个 actor 事件(驱动 session 的持久收件箱)和每次 delivery 尝试是 PostgreSQL 里的一行。这些通常不为审计而读——它们是运维状态——但它们构成了系统被要求做什么、是否已投递的记录。Console 的 /background-agent-jobs/:id 路由显示任务的 attempts 和 error;/ai-gateway/conversations 路由显示一个回合做过的模型调用。

配合使用

一个真实的审计问题通常跨多个面:

问题 去哪查
“谁给了这个 agent 做 Y 的权限?” permission_grants + /principals/:uid/grants
“这个回合 agent 做了什么?” /ai-gateway/conversations/:id/messages
“调度触发了吗?” /cron-schedules/:id/runs
“任务失败被重试了吗?” /background-agent-jobs/:id(attempts、error)
“那时 worker 日志记了什么?” 结构化控制面日志

本指南不是什么

它不是合规框架——Ankole 提供界面,你的合规姿态决定保留多久。它不是 SIEM 集成指南——日志是结构化 JSON,摄入器是你的选择。它也不是经过测试的备份的替代——审计轨迹住在 PostgreSQL 里,无法还原的数据库带走轨迹。

下一步