有条件地打印包含敏感数据的调试信息
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":"*****"}
}
我是 运行 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":"*****"}
}