You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:45:40