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 關注
- 115 瀏覽
添加回答
舉報