本文主要研究一下golang的zap的NewTeegit
zap@v1.16.0/zapcore/tee.gogithub
type multiCore []Core func NewTee(cores ...Core) Core { switch len(cores) { case 0: return NewNopCore() case 1: return cores[0] default: return multiCore(cores) } }
NewTee方法根據cores個數來返回不一樣的Core,若len(cores)爲0,返回NewNopCore,若爲1則返回cores[0],默認返回
[]Core
zap@v1.16.0/zapcore/tee.gogolang
func (mc multiCore) With(fields []Field) Core { clone := make(multiCore, len(mc)) for i := range mc { clone[i] = mc[i].With(fields) } return clone } func (mc multiCore) Enabled(lvl Level) bool { for i := range mc { if mc[i].Enabled(lvl) { return true } } return false } func (mc multiCore) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { for i := range mc { ce = mc[i].Check(ent, ce) } return ce } func (mc multiCore) Write(ent Entry, fields []Field) error { var err error for i := range mc { err = multierr.Append(err, mc[i].Write(ent, fields)) } return err } func (mc multiCore) Sync() error { var err error for i := range mc { err = multierr.Append(err, mc[i].Sync()) } return err }
multiCore提供了With、Enabled、Check、Write、Sync方法,它們都是遍歷multiCore執行對應的操做
func teeDemo() { buf := &bytes.Buffer{} teeCore := zapcore.NewTee( zapcore.NewCore(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), zapcore.AddSync(buf), zap.InfoLevel), zapcore.NewCore(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()), zapcore.Lock(os.Stdout), zap.InfoLevel), ) logger := zap.New(teeCore) logger.Info("hello") fmt.Print(buf) }
這裏zapcore.NewTee將json及console兩個core銜接在一塊兒,建立logger,以後logger會往兩個core寫入數據
輸出json
2020-12-12T22:29:47.328+0800 INFO hello {"level":"info","ts":1607783387.3285708,"msg":"hello"}
zapcore.NewTee方法能夠把多個core銜接在一塊兒,對應logger的操做會同時操做這些core。code