有条件地打印包含敏感数据的调试信息

Conditionally print debug info containing sensitive data

我是 运行 Go 程序作为 k8s 工作。

应用程序向 elasticsearch 集群向 create 用户发送 API 请求,因此它将包含敏感数据(用户密码)。

    requestDump, err := httputil.DumpRequest(req, true)
    responseDump, err := httputil.DumpResponse(resp, true)
    esapiClient.log.Printf("got response code %d when creating user: %s\n", resp.StatusCode, user.Username)
    if resp.StatusCode != http.StatusOK {
        esapiClient.log.Printf("error: got response code: %d when creating user %s\n", resp.StatusCode, user.Username)
        esapiClient.log.Println("Request\n", string(requestDump))
        esapiClient.log.Println("Response\n", string(responseDump))
        return ErrResponseCode
    }

当事情进展不顺利时,我希望能够转储请求和响应(尤其是在 400 情况下)以检查出了什么问题(主要是可能格式错误的请求)。

推荐的做法是什么?日志级别是解决此问题的唯一方法吗?

日志级别无解。您的目标应该是不让 PII(个人身份信息)完全出现在您的日志转储中,包括在调试模式下启动服务时。

根据您进行日志记录的方式,只需在您的结构上实现相关接口并省略或编辑包含 PII 的字段。如果出于调试目的需要了解有关原始值的一些线索的字段,您可以只编辑其中的一部分。

例如,如果你用fmt动词或类似的方式登录,你可以实现Stringer接口:

type User struct {
    Name     string
    Password string
}

func (u User) String() string {
    return fmt.Sprintf("{%s %s}", u.Name, "*****")
}


func main() {
    u := User{"pkaramol", "secret"}
    fmt.Println(u) // {pkaramol *****}
    
}

如果您登录JSON,实施MarshalJSON进行编辑,或使用结构标签json:"-"省略:

func (u User) MarshalJSON() ([]byte, error) {
    return json.Marshal(map[string]interface{}{
        "name": u.Name,
        "password": "*****",
    })
}

func main() {
    u := User{"pkaramol", "secret"}
    b, _ := json.Marshal()
    fmt.Println(string(b)) // {"name":"pkaramol","password":"*****"}
}