目标:形成“业务日志 + 结构化审计 + 采样/脱敏/留痕”的一体化体系,满足定位与合规。
🎯 文章目标
- 给出需要记录的字段与留存策略
- 提供服务侧与网关侧的实现示例
- 输出观测/稽核看板与常见风险
📚 背景/前置
- 日志层次:
- 运行日志(level/模块)
- 结构化业务日志(JSON,便于检索与统计)
- 审计日志(不可篡改/追溯)
- 合规与隐私:PII/敏感字段脱敏,最小化收集、目的绑定、可用期限制
🔧 核心内容
1) 记录哪些字段(建议)
- request: req_id、ts、caller(org/user/app)、ip、ua、path、method
- llm: provider、model、params(温度/采样)、tokens(in/out)、cost、latency
- content: prompt_hash、prompt_len、has_attachment、unsafe_flags
- outcome: status、error_code、cache_hit、route、degrade
2) 采样与脱敏
- 采样:按路径/错误/慢请求提升采样率(例如错误 100%,其余 1~5%)
- 脱敏:哈希化 PII(user_id/email/phone)、敏感实体替换(如 [SSN])
3) 留存与追溯
- 结构化日志 → Kafka/对象存储 + 生命周期(30/90/180 天分层)
- 审计日志 → WORM/只读桶 + 哈希链/签名(每日/每批)
💡 实战示例:Node.js 结构化日志 + 审计
javascript
import pino from 'pino';
const logger = pino({ level: process.env.LOG_LEVEL||'info' });
function redact(obj){
const clone = { ...obj };
if (clone.email) clone.email = 'hash:' + sha256(clone.email);
if (clone.phone) clone.phone = 'hash:' + sha256(clone.phone);
return clone;
}
export function audit(req, res, ext){
const rec = redact({
req_id: req.id,
ts: Date.now(),
caller: req.user,
ip: req.ip,
path: req.path,
method: req.method,
provider: ext.provider,
model: ext.model,
params: ext.params,
tokens: ext.tokens,
cost: ext.cost,
latency: ext.latency,
prompt_hash: sha256(req.body?.prompt||''),
prompt_len: (req.body?.prompt||'').length,
status: res.statusCode,
error_code: ext.errorCode,
cache_hit: ext.cacheHit,
route: ext.route,
degrade: ext.degrade
});
logger.info(rec, 'llm_audit');
}
网关侧(Nginx)补充字段
nginx
log_format json escape=json '{"ts":"$time_iso8601","req_id":"$request_id","ip":"$remote_addr","ua":"$http_user_agent","path":"$uri","status":$status,"req_time":$request_time,"upstream_time":"$upstream_response_time","org":"$http_x_org","api_key":"$http_x_api_key"}';
access_log /var/log/nginx/access.json json;
📊 指标看板(速查)
- LLM 成本:tokens(in/out)、每请求成本、月度预算
- 质量:成功率、错误分布、最慢 5% 请求画像
- 合规:审计日志覆盖率、脱敏命中率、不合规事件数量
🧪 踩坑与经验
- 只记原始文本不做脱敏:合规风险巨大
- 审计日志可写可改:无法满足稽核与争议举证
- 未关联 req_id:跨层追踪困难
- 未记录 tokens/成本:成本不可控
📎 参考与延伸
- PII/数据最小化原则、WORM 存储
- OpenTelemetry events/logs/trace 统一治理实践
💭 总结
- 以“结构化 + 脱敏 + 可追溯”为核心,既能定位问题也能满足合规与复盘