Golang zap 日志简单实用

zap Golang 第三方库记录日志

Zap 是非常快的、结构化的、分日志级别的Go日志库

功能简介

  • 可以配置日志输入格式 JSON 和普通文本
  • 可以配置日志输出位置 控制台 和 文件
  • 可以配置日志级别 debug、info、warn、 error
    安装
go get -u go.uber.org/zap

基本使用

logger, err := zap.NewProduction()
if err != nil {
}

logger.Info("logger zap 日志")
logger.Warn("logger zap 日志")
logger.Error("logger zap 日志")

// 输出结果 在控制台
{"level":"info","ts":1723087266.398946,"caller":"golang-templant/main.go:26","msg":"logger zap 日志"}
{"level":"warn","ts":1723087266.399047,"caller":"golang-templant/main.go:27","msg":"logger zap 日志"}
{"level":"error","ts":1723087266.399051,"caller":"golang-templant/main.go:28","msg":"logger zap 日志","stacktrace":"main.main\n\t/Users/wangjiaxin/workspace/GoLangProject/src/golang-templant/main.go:2nruntime.main\n\t/usr/local/go/src/runtime/proc.go:271"}

// level 日志等级 ts 时间戳 caller 文件名:行号 msg 日志内容

简单配置

// zai.New(Encoder, writeSyncer, level) Encode 编码格式 writeSyncer 输出位置 level 日志等级
// 1、encoder 输出格式
zapConfig := zap.NewProductionEncoderConfig()
zapConfig.TimeKey = "time"
zapConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
zapConfig.MessageKey = "message"
zapConfig.LevelKey = "日志级别"
encode := zapcore.NewJSONEncoder(zapConfig)
// 2、 日志写到指定位置
	file, _ := os.OpenFile("./log.text", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	errorFile, _ := os.OpenFile("./error.text", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	write := zapcore.AddSync(file)
	writeError := zapcore.AddSync(errorFile)
	console := zapcore.AddSync(os.Stdout)
	// 3、日志级别
	// 写到单个指定位置
	// 解析字符串 可以从配置文件中读取
	level, err := zapcore.ParseLevel("info")
	if err != nil {
		level = zapcore.InfoLevel
	}

	// 写到多个指定位置
	coreNew := zapcore.NewCore(encode, zapcore.NewMultiWriteSyncer(write, writeError, console), level)
	// 在做日志封装的时候 使用zap.AddCallerSkip(1) 记录日志路径更准确
	//logger = zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
	logger = zap.New(coreNew, zap.AddCaller())
	logger.Debug("----->>>>> 日志信息 debug <<<<<-----", zap.Int64("uid", 1))
	logger.Info("----->>>>> 日志信息 info <<<<<-----", zap.Int64("uid", 2))
	logger.Warn("----->>>>> 日志信息 warn <<<<<-----", zap.Int64("uid", 3))
	logger.Error("----->>>>> 日志信息 error <<<<<-----", zap.Int64("uid", 4))
	// 记录不同日志级别到不同文件
	core := zapcore.NewCore(encode, write, level)
	coreError := zapcore.NewCore(encode, writeError, zapcore.ErrorLevel)
	newCore := zapcore.NewTee(core, coreError)
	newLogger := zap.New(newCore, zap.AddCaller())
	newLogger.Debug("----->>>>> 日志信息 debug <<<<<-----", zap.Int64("uid", 1))
	newLogger.Info("----->>>>> 日志信息 info <<<<<-----", zap.Int64("uid", 2))
	newLogger.Warn("----->>>>> 日志信息 warn <<<<<-----", zap.Int64("uid", 3))
	newLogger.Error("----->>>>> 日志信息 error <<<<<-----", zap.Int64("uid", 4))
	// 日记文件切割
	newEncode := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
	writeFile := &lumberjack.Logger{
		Filename:   "./app.log.text", // 文件名
		MaxSize:    10,               // 文件大小 M
		MaxBackups: 3,                // 保留文件最大个数
		MaxAge:     28,               // 保存时间 天
		Compress:   false,            // 是否压缩文件
		LocalTime:  true,             // 是否使用本地时间
	}
	writeSyncFile := zapcore.AddSync(writeFile)
	lCore := zapcore.NewCore(newEncode, writeSyncFile, zapcore.DebugLevel)
	log := zap.New(lCore)
	for i := 0; i < 100000; i++ {
		log.Debug("----->>>>> 日志信息 debug <<<<<-----", zap.Int("uid", i))
		log.Info("----->>>>> 日志信息 info <<<<<-----", zap.Int("uid", i))
		log.Warn("----->>>>> 日志信息 warn <<<<<-----", zap.Int("uid", i))
		log.Error("----->>>>> 日志信息 error <<<<<-----", zap.Int("uid", i))
	}

posted @ 2024-08-08 15:42  影的记忆  阅读(4)  评论(0编辑  收藏  举报