Go的日志库 zap

1.安装

go get -u go.uber.org/zap

2.基本使用

默认json格式

  • Logger

    package main
    
    import "go.uber.org/zap"
    
    func main() {
    	logger, err := zap.NewProduction()
    	if err != nil {
    		panic(err)
    	}
    
    	var uid int64 = 66666
    	data := []int{1, 2, 3}
    	logger.Info(
    		"日志信息",
    		zap.Int64("uid", uid),
    		zap.Bool("isLogin", true),
    		zap.String("name", "mkl"),
    		zap.Any("data", data),
    		/**
    		{
    			"level":"info",
    			"ts":1654522205.109878,
    			"caller":"zap/main.go:13",
    			"msg":"日志信息",
    			"uid":66666,
    			"isLogin":true,
    			"name":"mkl",
    			"data":[1,2,3]
    		}
    		*/
    	)
    }
    
  • Sugar

    package main
    
    import "go.uber.org/zap"
    
    func main() {
    	logger, err := zap.NewProduction()
    	if err != nil {
    		panic(err)
    	}
    
    	sLogger := logger.Sugar()
    
    	var uid int64 = 6666
    	name := "mkl"
    	sLogger.Infof(
    		"记录日志, %v, %v",
    		uid,
    		name,
    	)
    }
    

3.配置

  • 自定义输出方式

    encoder/writer/level

    package main
    
    import (
    	"os"
    
    	"go.uber.org/zap"
    	"go.uber.org/zap/zapcore"
    )
    
    func main() {
    	// 定制zap日志对象
    	encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
    	file, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
    	fileWS := zapcore.AddSync(file)
    	consoleWS := zapcore.AddSync(os.Stdout)
    	// zapcore.Core:
    	// Encoder: 编码
    	// WriteSyncer: 写文件对象
    	// LogLevel: 级别(生产环境不需要记录debug级别日志)
    	s := "info" // 从配置文件读取一个日志级别
    	level, err := zapcore.ParseLevel(s)
    	if err != nil {
    		level = zapcore.InfoLevel
    	}
    
    	core := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(fileWS, consoleWS), level)
    	logger := zap.New(core)
    	logger.Info("输出日志.")
    }
    
  • 配置时间格式

    package main
    
    import (
    	"os"
    
    	"go.uber.org/zap"
    	"go.uber.org/zap/zapcore"
    )
    
    // initLogger 日志对象初始化
    func initLogger() *zap.Logger {
    	// 配置时间  zap.NewProduction() 默认会在日志中记录调用信息
    	encoderCfg := zap.NewProductionEncoderConfig()
    	encoderCfg.TimeKey = "time"
    	encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
    	encoderCfg.EncodeLevel = zapcore.CapitalLevelEncoder // 大写的日志级别
    
    	encoder := zapcore.NewJSONEncoder(encoderCfg)
    	file, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
    	fileWS := zapcore.AddSync(file)
    	consoleWS := zapcore.AddSync(os.Stdout)
    	s := "info" // 从配置文件读取一个日志级别
    	level, err := zapcore.ParseLevel(s)
    	if err != nil {
    		level = zapcore.InfoLevel
    	}
    
    	core := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(fileWS, consoleWS), level)
    	logger := zap.New(core, zap.AddCaller()) // 添加调用信息
    	return logger
    }
    
    func main() {
    	logger := initLogger()
    	logger.Info("输出日志.")
    }
    

4.输出不同级别的日志在不同文件中

package main

import (
	"os"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

// initLogger 日志对象初始化
func initLogger() *zap.Logger {
	// 配置时间  zap.NewProduction() 默认会在日志中记录调用信息
	encoderCfg := zap.NewProductionEncoderConfig()
	encoderCfg.TimeKey = "time"
	encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
	encoderCfg.EncodeLevel = zapcore.CapitalLevelEncoder // 大写的日志级别

	encoder := zapcore.NewJSONEncoder(encoderCfg)
	logFile1, _ := os.Create("./app.log")
	core1 := zapcore.NewCore(encoder, zapcore.AddSync(logFile1), zapcore.InfoLevel)

	logFile2, _ := os.Create("./app.err.log")
	core2 := zapcore.NewCore(encoder, zapcore.AddSync(logFile2), zapcore.ErrorLevel)

	newCore := zapcore.NewTee(core1, core2)

	logger := zap.New(newCore, zap.AddCaller()) // 添加调用信息
	return logger
}

func main() {
	logger := initLogger()
	logger.Info("输出日志.")
}

5.日志切割

通过第三方Lumberjack实现日志切割

package main

import (
	"os"

	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

// initLogger 日志对象初始化
func initLogger() *zap.Logger {
	// 配置时间  zap.NewProduction() 默认会在日志中记录调用信息
	encoderCfg := zap.NewProductionEncoderConfig()
	encoderCfg.TimeKey = "time"
	encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
	encoderCfg.EncodeLevel = zapcore.CapitalLevelEncoder // 大写的日志级别

	encoder := zapcore.NewJSONEncoder(encoderCfg)
	file := &lumberjack.Logger{
		Filename:   "./test.log", // 日志的位置
		MaxSize:    10,           // 日志最大大小
		MaxBackups: 5,            // 保留文件最大数
		MaxAge:     30,           // 保留最大天数
		Compress:   false,        // 是否压缩文件
	}
	// file, _ := os.OpenFile("./test.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	fileWS := zapcore.AddSync(file)
	consoleWS := zapcore.AddSync(os.Stdout)
	s := "info" // 从配置文件读取一个日志级别
	level, err := zapcore.ParseLevel(s)
	if err != nil {
		level = zapcore.InfoLevel
	}

	core := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(fileWS, consoleWS), level)
	logger := zap.New(core, zap.AddCaller()) // 添加调用信息
	return logger
}

func main() {
	logger := initLogger()
	logger.Info("输出日志.")
}
posted on 2022-06-07 22:57  _tiny_coder  阅读(228)  评论(0编辑  收藏  举报