如何在Uber Zap Go日志中隐藏敏感字段?求示例
使用Uber Zap隐藏日志敏感字段的方法及示例
在Uber Zap中,你可以通过自定义日志核心(Core)或修改编码器逻辑来自动隐藏敏感字段,以下是两种常用实现方式:
方法一:自定义Core拦截敏感字段
通过包装原生Core,重写Write方法遍历所有字段,替换敏感字段的值:
package main import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" ) // 定义需要屏蔽的敏感字段 var sensitiveFields = map[string]bool{ "password": true, "token": true, "creditCard": true, "idCard": true, } // 自定义Core,封装原生Core实现字段拦截 type sensitiveMaskCore struct { zapcore.Core } func (c *sensitiveMaskCore) Write(entry zapcore.Entry, fields []zapcore.Field) error { processedFields := make([]zapcore.Field, len(fields)) for i, field := range fields { if sensitiveFields[field.Key] { // 将敏感字段值替换为*** processedFields[i] = zap.String(field.Key, "***") } else { processedFields[i] = field } } return c.Core.Write(entry, processedFields) } func main() { // 初始化基础配置 config := zap.NewProductionConfig() // 通过WrapCore注入自定义Core logger := zap.New(config.Build(zap.WrapCore(func(c zapcore.Core) zapcore.Core { return &sensitiveMaskCore{c} })).Core()) defer logger.Sync() // 测试包含敏感字段的日志 logger.Info("用户登录操作", zap.String("username", "alice"), zap.String("password", "mySecurePass123"), zap.String("token", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."), zap.Int("loginCount", 5), ) }
运行后日志中password和token字段的值会被替换为***,其他字段正常输出。
方法二:通过EncoderConfigHook修改字段处理逻辑
这种方式无需自定义Core,直接修改编码器的字段处理规则,更轻量化:
package main import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" ) func main() { sensitiveKeys := map[string]bool{"password": true, "token": true, "phone": true} config := zap.NewProductionConfig() // 注册编码器钩子,拦截并替换敏感字段 config.EncoderConfig.FunctionEncoder = func(encoder zapcore.Encoder, field zapcore.Field) { if sensitiveKeys[field.Key] { zapcore.String(field.Key, "***").AddTo(encoder) return } field.AddTo(encoder) } logger, _ := config.Build() defer logger.Sync() // 测试日志 logger.Info("用户更新信息", zap.String("userId", "U12345"), zap.String("phone", "138xxxx1234"), zap.String("password", "newSecret456"), zap.Bool("emailVerified", true), ) }
注意事项
- 若日志包含嵌套结构体字段,需要在处理逻辑中递归解析结构体,对嵌套的敏感字段进行替换
- 确保替换后的字段类型与原类型一致,避免破坏日志格式(比如原字段是int类型,替换时尽量用
zap.Int保持类型) - 可根据业务需求动态调整敏感字段列表,比如从配置文件加载敏感字段名
内容的提问来源于stack exchange,提问作者EagerLearner
相关产品推荐
相关产品推荐

