Skip to content

目标:形成“业务日志 + 结构化审计 + 采样/脱敏/留痕”的一体化体系,满足定位与合规。

🎯 文章目标

  • 给出需要记录的字段与留存策略
  • 提供服务侧与网关侧的实现示例
  • 输出观测/稽核看板与常见风险

📚 背景/前置

  • 日志层次:
    • 运行日志(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 统一治理实践

💭 总结

  • 以“结构化 + 脱敏 + 可追溯”为核心,既能定位问题也能满足合规与复盘