Files
go-sip/docs/logging.md
T

41 lines
5.7 KiB
Markdown

# Dispatcher / Agent 日志
两个角色统一由 Logrus 输出一行一条的 JSON 日志。已有 slog 和标准 log 调用交给同一输出,不另设日志系统。
## 启动
```sh
sip-go-agent dispatcher --mode nonprod-real --debug
sip-go-agent agent --mode nonprod-real -D
```
不传 `--debug/-D`:记录工作流程、交互方向、阶段、关联身份、结果、耗时和错误,不记录收发正文。传入后:保留这些记录,并增加实际 HTTP、MQ、Unary RPC 收发正文的安全副本;不截断非敏感可读业务正文。
Agent 的抓包开关独立为 `--capture`:只在显式开启时要求 `AGENT_EVIDENCE_ROOT` 及逐通有效的外部抓包凭证。`--debug/-D` 不启动抓包、不要求 tcpdump 或证据凭证;`--capture` 也不自动开启详细日志。独立 `sip-call` 的 `--debug/-D` 仍保留原有抓包含义,本次不改。
## 记录内容
- HTTP:请求开始、实际被读取的可读请求/响应正文(JSON、text/*、XML、form)、响应状态、正文读取结果。认证头不记录;URL 的认证、查询和 fragment 部分删除。SDK/native ARI 的 HTTP 客户端使用同一观察输出,保留 TLS、超时、重定向和 WebSocket 升级行为。
- MQ:实际入站/出站字节;接收、校验、处理、ACK/NACK/Reject、发布及 broker confirm。`publisher_confirmed` 只证明 RabbitMQ 确认,记录 `saas_processed=false`,不能据此声称 SaaS 已处理。
- RPC:实际边界的 protobuf 请求/响应投影,明确 `wire_encoding=protobuf`。冻结配置中的 `*_json` 字节展开为 JSON,其余字节仅记录长度;不是业务内部 CallSpec,也不声称 JSON 是 protobuf 原始线格式。客户端响应收到和服务端响应准备完成分别记录,服务端返回不能冒充对端收讫。
- 业务流程:持久接纳/重复忽略、号码拒绝、未来 issued_at/容量/准入等待、选线、预占及拨号前取消、请求执行、交付未知保留占用、Agent 排程/执行/结束、结果回报及恢复。拒绝和等待不是无日志的返回;节点失败记录具体原因,而不是只有错误类型。
- 恢复:逐条记录验证/加载、原授权申请、PUT 屏障/结果、保存退避、原结束/结果回报和确认;带已有事件/租户/录音/上传身份、状态、尝试次数和下次尝试时间。未知或到期明确要求人工检查并保留文件,不伪装成已完成或自动重放。
`event_id/task_id/call_id/request_id` 等已有标识用于关联记录;只有组件实际掌握的标识才输出。
## 正文边界
密钥、Token、认证信息、完整 prompt/messages/transcript/text/content/结束语、原始 SIP 内容及音频不输出。敏感字段按键名隐藏,重复键逐个处理;其他 JSON 的空白、重复键和数字写法保留,原业务字节与对象不修改。内容字段仅一份分类表(含conversation/history及其别名),所有JSON、Markup、文本续行和标量路径共用;内容分类必定敏感,避免字段分类分离。内容标签在错误前缀之后也建立归属,保留其前失败原因,不以行首为唯一匹配位置。文本字段使用同一引号/非引号词法器与归一化入口,JSON 字段名转义经标准 JSON 解码后分类;非法引号字段不能可靠分类时,其尾部保持隐藏。完整嵌入 JSON 由结构化脱敏处理,不让文本词法器删除相邻的真实诊断字段。所有普通/Debug 日志的 message、error 和其他标量共用字段/对话保护;对话保护跨空行、任意说话者及未知/嵌套消息字段持续保持。自由文本没有可靠结构结束符时,内容标签拥有后续文本,不以任意字段或状态行推断结束;只逐行保留已校验类型的诊断数值、UUID、时间戳、已知状态,这些行不解除后续内容保护。结构化 JSON/Markup/form 仍按结构保留外部非敏感字段;named 敏感非 void 控件保护其包裹内容,void input 不影响后续普通节点。纯文本以 UTF-8 安全副本记录;敏感键值/多行提示词、Markup 的敏感标签/输入值、单字段和多字段表单共用百分号解码与敏感分类,并应用于普通/Debug 标量诊断;裸 flag 按合法空值字段处理。单个 key/value 解码失败以明确 INVALID_FORM 标记隐藏该字段,不回退输出原表单、不撤销此前脱敏,其余诊断字段保留。表单敏感字段排除,明确不属于内容字段的其他可读正文保留;自由文本内容标签后的未分界文字持续按内容处理,不猜测其已成为业务正文。HTTP 二进制和升级后的 WebSocket 流不进入正文日志。
自由文本里的 Authorization/Proxy-Authorization(包括 Basic/Digest)、Cookie、无字段名的私钥 PEM 块,以及错误里嵌入的 JSON 对象/数组和 quoted API key/Token,同样排除;已隐藏的 JSON 认证字段不删掉后面的非敏感业务原因。实际错误仍返回,原原因保留。非法 JSON、无法安全展开的嵌套数据或部分读取不能退回打印未经处理的正文:输出 `redaction_error`、字节数及 SHA-256。HTTP `body_complete=false` 只表示已观测部分,不能把它当作完整网络正文;原读取/关闭错误继续返回,不因日志改变重试、确认或业务结果。
## 固定环境部署及查看
```sh
python3 deploys/production/production.py deploy --host server.sip --debug
journalctl --user -u go-sip-dispatcher.service -f -o cat
journalctl --user -u go-sip-agent.service -f -o cat
```
部署时 `--debug` 同时写入两个固定服务,不增加 `--capture`,普通重部署不清数据。实际收发详情仅出现于该交互确实发生时;不得为了验证日志生成外呼消息或独立调用真实 AI/OSS。