聊聊golang的zap的NewTee

季珪
• 阅读 2506

本文主要研究一下golang的zap的NewTee

NewTee

zap@v1.16.0/zapcore/tee.go

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

multiCore

zap@v1.16.0/zapcore/tee.go

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写入数据

输出

2020-12-12T22:29:47.328+0800    INFO    hello
{"level":"info","ts":1607783387.3285708,"msg":"hello"}

小结

zapcore.NewTee方法可以把多个core衔接在一起,对应logger的操作会同时操作这些core。

doc

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
科工人 科工人
4年前
聊聊golang的DDD项目结构
序本文主要研究一下golang的DDD项目结构interfacesfoodappserver/interfacesinterfacesgit:(master)tree.|____fileupload||____fileformat.go||____fileupload.go|____food_handler.go|__
Wesley13 Wesley13
4年前
Go gRPC进阶
前言上篇介绍了gogrpcmiddleware(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fgrpcecosystem%2Fgogrpcmiddleware)的grpc_zap、grpc_auth和grpc_recovery
Stella981 Stella981
4年前
Golang学习系列第一天:安装golang
0. ssh连接linux(我用的centos7),略1. golang下载由于Golang官网https://golang.org/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgola
Stella981 Stella981
4年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
NEO从源码分析看UTXO交易
_0x00前言_社区大佬:“交易是操作区块链的唯一方式。”_0x01交易类型_在NEO中,几乎除了共识之外的所有的对区块链的操作都是一种“交易”,甚至在“交易”面前,合约都只是一个小弟。交易类型的定义在Core中的TransactionType中:源码位置:neo/Core/TransactionType
Stella981 Stella981
4年前
RedisTemplate读取slowlog
序本文主要研究一下如何使用RedisTemplate(lettuce类库)读取slowlogmaven<dependency<groupIdorg.springframework.boot</groupId<artifactIdspringbootstarterdata