1 回答
TA贡献1821条经验 获得超4个赞
对此没有完全通用的解决方案。只有特定的解决方案具有不同的权衡。
也许最通用的解决方案是编写一个函数,通过反射检查每种表单类型,并忽略输出中的任何敏感字段。
logger.Logf("%s", stripPassword(formInput));
这具有不再使用%+v动词的副作用,这通常无关紧要,但是如果您的类型实现了fmt.Formatter接口,它将改变行为。但话又说回来,你的目标是改变行为,所以...
这导致了第二种选择:
您可以Format()在您的类型上实现自定义方法,以导致%+v(或%v)%s输出您想要的任何内容(省略私有字段)。
沿着相同的思路,但更简单的是,如果您正在记录(或愿意记录)JSON 输出,只需json.Marshaler为每种类型隐含您自己的输出即可。例子:
func (i *SomeFormInput) MarshalJSON() ([]byte, error) {
intermediate := struct{
*SomeFormInput
Password struct{} `json:"-"` // Occlude Password field in the embedded struct
MarshalJSON struct{} `json:"-"` // Occlude MarshalJSON method on embedded struct, to avoid infinite loop
}{
SomeFormInput: i,
}
return json.Marshal(intermediate)
}
类似的选项是将json:"-"标签用于不应输出的字段。例子:
type SomeFormInput struct {
Name string
Password string `json:"-"`
}
作为最后一个选项,您可以在将日志输出发送到记录器之前对其进行过滤。如果您使用 JSON,则可以使用标记化 json.Decoder解析数据,以仅省略您想要的键。对于任意文本,也许可以使用正则表达式。
对于我工作的大多数应用程序,我实际上总是使用 JSON 日志记录,我可能更喜欢选项 #4,然后是 #5。
- 1 回答
- 0 关注
- 87 浏览
添加回答
举报