1 回答
TA贡献1824条经验 获得超5个赞
您还必须Clone()从zapcore.Encoder接口实现。如果您希望保持父记录器不变,则必须构建一个实际的克隆——可能具有相同的配置,因此您可能希望将其存储为一个字段:
type prependEncoder struct {
zapcore.Encoder
pool buffer.Pool
cfg zapcore.EncoderConfig
}
func (e *prependEncoder) Clone() zapcore.Encoder {
return &prependEncoder{
// cloning the encoder with the base config
Encoder: zapcore.NewConsoleEncoder(e.cfg),
pool: buffer.NewPool(),
cfg: e.cfg,
}
}
如果你不实现它,运行的方法是调用时下一个最浅的方法logger.Clone(),它是Clone()在嵌入的声明的zapcore.Encoder。那一个就没有你的习惯EncodeEntry了。
现在运行以下命令:
logger.Info("this is info")
logger.Debug("this is debug")
logger.Warn("this is warn")
child := logger.With(zap.String("foo", "bar"))
logger.Warn("original")
child.Info("new one")
输出:
<6> INFO this is info
<7> DEBUG this is debug
<4> WARN this is warn
cloning...
<4> WARN original
<6> INFO new one {"foo": "bar"}
- 1 回答
- 0 关注
- 78 浏览
添加回答
举报