加入收藏 | 设为首页 |

ope电竞app官网-golang开发:类库篇(一) Zap高性能日志类库的运用

海外新闻 时间: 浏览:175 次

为什么要用zap来写日志

原来是写PHP的,一向用的error_log,第一次写Go项目的时分,还真不知道该怎样写日志,后来就依照PHP的写法自己不成标准的捣鼓写。去了新公司之后,发现用的是zap。后来查询 了解了下zap,前搭档反响他们许多大公司都在运用zap写日志,GitHub上star 高达7K多,足以阐明它受欢迎的程度。

1.zap是Uber开源的日志库;2.许多大的公司和小的公司都在运用;3.跟seelog、logrus等类库比较,高性能是它最杰出的优势;我想以上几个原因就现已阐明晰它的广泛性、稳定性,就值得咱们去测验。

怎样运用zap

咱们说下简略的运用事例 辅弼当然是下载 go get -u go.uber.org/zap 先贴一个我这边常用的zap的装备

zap.Config{
Level: zap.NewAtomicLevelAt(zap.DebugLevel),
Development:true,
Encoding:"json",
EncoderConfig: zapcore.EncoderConfig{
TimeKey:"t",
LevelKey:"level",
NameKey:"log",
CallerKey:"caller",
MessageKey:"msg",
StacktraceKey:"trace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime:时刻格局函数,
EncodeDuope电竞app官网-golang开发:类库篇(一) Zap高性能日志类库的运用ration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
},
OutputPaths:[]string{"/tmp/zap.log"},
ErrorOutputPaths:[]string{"/tmp/zap.log"},
InitialFields: map[string]interface{}{
"app":"test",
},
}

根本装备的阐明

Level:日志等级,跟其他言语是相同的。只不过它需求的类型是AtomicLevel。所以需求运用zap.NewAtomicLevelAt做下如下的转化。

zap.NewAtomicLevelAt(zap.DebugLevel)
zap.DebugLevel
zap.InfoLevel
zap.WarnLevel
zap.ErrorLevel

Development:bool 是否是开发环境。假如是开发形式,对DPanicLevel进行仓库盯梢 DisableCaller:bool 制止运用调用函数的文件名和行号来注释日志。默许进行注释日志 DisableStacktrace:bool 是否禁用仓库盯梢捕获。默许对Warn等级以上和出产error等级以上的进行仓库盯梢。Encoding:编码类型,现在两种json 和 console【依照空格离隔】,常用json EncoderConfig:生成格局的一些装备--TODO 后边咱们详细看下EncoderConfig装备各个阐明 OutputPaths:[]string 日志写入文件的地址 ErrorOutputPaths:[]string 将体系内的error记录到文件的地址 InitialFields:map[string]interface{} 参加一些初始的字段数据,比方项目名 当然了,假如想控制台输出,OutputPaths和ErrorOutputPaths不能装备为文件地址,而应该改为stdout。

关于config的装备,详细的能够参阅文件里边的注释 go.uber.org/zap/config.go type Config struct

EncoderConfig装备阐明

MessageKey:输入信息的key名 LevelKey:输出日志等级的key名 TimeKey:输ope电竞app官网-golang开发:类库篇(一) Zap高性能日志类库的运用出时刻的key名 NameKey CallerKey StacktraceKey跟以上相似,看姓名就知道 LineEnding:每行的分隔符。根本zapcore.DefaultLineEnding 即"\n" EncodeLevope电竞app官网-golang开发:类库篇(一) Zap高性能日志类库的运用el:根本zapcore.LowercaseLevelEncoder。将日志等级字符串转化为小写 EncodeTime:输出的时刻格局 EncodeDuration:一般zapcore.SecondsDurationEncoder,履行耗费的时刻转化成浮点型的秒 EncodeCaller:一般zapcore.ShortCallerEncoder,以包/文件:行号 格局化调用仓库 EncodeName:可选值。

详细EncoderConfig的阐明,能够参阅文件里边的注释 go.uber.org/zapcore/encoder.go type EncoderConfig struct

举个栗子

你扯这么多装备阐明,谁有时刻看这玩意,写个常用的让咱们照着用就好了嘛。

package main
import(
"fmt"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"time"
)
var logger *zap.Logger
func formatEncodeTime(t time.Time, enc zapcore.PrimitiveArrayEncoder){
enc.AppendString(fmt.Sprintf("%d%02d%02d_%02d%02d%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()))
}
func FormateLog(args []interface{})*zap.ope电竞app官网-golang开发:类库篇(一) Zap高性能日志类库的运用Logger{
log := logger.With(ToJsonData(args))
return lui设计培训og
}
func Debug(msg string, args ...interface{}){
FormateLog(args).Sugar().Debugf(msg)
}
func ToJsonData(args []interface{}) zap.Field{
det := make([]string,0)
if len(args)>0{
for _, v := range args {
det = append(det, fmt.Sprintf("%+v", v))
}
}
zap := zap.Any("detail", det)
return zap
}
func InitZapLog(){
cfg := zap.Config{
Level: zap.NewAtomicLevelAt(zap.DebugLevel),
Development:true,
Encoding:"json",
EncoderConfig: zapcore.EncoderConfig{
TimeKey:"t",
LevelKey:"level",
NameKey:"logger",
CallerKey:"caller",
MessageKey:"msg",
StacktraceKey:"trace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: formatEncodeTime,
EncodeDuration: zapcore.SecondsDurationope电竞app官网-golang开发:类库篇(一) Zap高性能日志类库的运用Encoder,
EncodeCaller: zapcore.ShortCallerEncoder,
},
OutputPaths:[]string{"/tmp/zap.log"},
ErrorOutputPaths:[]string{"/tmp/zap.log"},
InitialFields: map[string]interface{}{
"app":"test",
},
}
var err error
logger, err = cfg.Build()
if err !=nil{
panic("log init fail:"+ err.Error())
}
}
func main(){
InitZapLog()
defer logger.Sync()
a :=[]string{"test","hello","world"}
Debug("output",a)
}

履行下,就会在日志文件上输入依照咱们装备日志格局。

tail -f /tmp/zap.log
{"level":"debug","t":"20190630_044053","caller":"myproject/main.go:21","msg":"output","app":"test","detail":["[test hello world]"]}

然后咱们试下控制台输出,修正三个console相关的装备代码 OutputPaths: []string{"stdout"}, ErrorOutputPaths: []string{"stdout"}, 控制台窗口就会输出 {"level":"debug","t":"20190630_092533","caller":"myproject/main.go:21","msg":"output","app":"test","detail":["[test hello world]"]}

当然了,zap最想的运用和文档,看官网嘛 https://github.com/uber-go/zap https://godoc.org/go.uber.org/zap