完整记录结构化错误可能泄露个人信息、查询内容和源代码
原文依据:6 处示例把用户邮箱和数据库查询写入错误对象,另一个配置示例启用源代码片段;随后又建议把整个错误进行 JSON 序列化或交给日志器。错误属性会沿调用栈传播,因此这些内容可能一起进入集中日志或错误跟踪系统。
日志读取者或第三方监控服务可能获得用户标识、邮箱、内部 SQL、业务数据或应用源代码。若请求/响应附件选择包含正文,风险还会扩大到令牌和提交内容。
这些是示例而非已经执行的操作,但若用户照搬,错误对象会包含邮箱、SQL 查询等数据,并可能被完整序列化到日志。高级配置还明确将源代码片段设为可见;若这类错误发送到集中日志或第三方错误跟踪服务,个人信息、查询结构及内部源码可能被披露。用户可要求作者默认隐藏源码,并在记录前对请求、查询和用户属性进行筛选或脱敏。
return nil, oops. In("user-repository"). Tags("database", "postgres"). With("query", query). With("user_id", id). Wrapf(err, "failed to fetch user from database") }查看另外 5 个位置
Tags("orders", "checkout"). Tenant(req.TenantID, "plan", req.Plan). User(req.UserID, "email", req.UserEmail)```gooops.StackTraceMaxDepth = 20 // adjust stack trace depthoops.SourceFragmentsHidden = false // enable source code fragmentsloc, _ := time.LoadLocation("America/New_York")```gofmt.Printf("%+v\n", err) // verbose with stack tracebytes, _ := json.Marshal(err) // JSON for loggingslog.Error(err.Error(), slog.Any("error", err)) // slog integration``` Code("network_failure"). // machine-readable identifier User("user-123", "email", "foo@bar.com"). // user context With("query", query). // custom attributes Errorf("failed to fetch user: %s", "timeout")```func (r *UserRepository) FetchUser(id string) (*User, error) { query := "SELECT * FROM users WHERE id = $1" row, err := r.db.Query(query, id) if err != nil { return nil, oops. In("user-repository"). Tags("database", "postgres"). With("query", query). With("user_id", id). Wrapf(err, "failed to fetch user from database") }