[go-每日一库] go使用uber的zap库简单实现日志功能

代码结构:

.
+--- go.mod
+--- go.sum
+--- logs
|   +--- zap.log
+--- main.go
+--- zlog
|   +--- log.go

见代码:

// https://mp.weixin.qq.com/s/Jh2iFY5uGe0qCFdKZWjotA
package zlog

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

	"os"
	"path"
	"runtime"
)

var logger *zap.Logger

func init()  {
	encoderConfig := zap.NewProductionEncoderConfig()
	// set time format
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	// set log codec -> json
	encoder := zapcore.NewJSONEncoder(encoderConfig)

	file, _ := os.OpenFile("D:\\demo1\\src\\demo\\demo06\\zap-log\\logs\\zap.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 644)
	fileWriterSyncer := zapcore.AddSync(file)

	core := zapcore.NewTee(
		// output to console
		zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), zapcore.DebugLevel),
		// output to file
		zapcore.NewCore(encoder, fileWriterSyncer, zapcore.DebugLevel),
	)

	logger = zap.New(core)
}


// log rotate
func getFileLogWriter() (writeSyncer zapcore.WriteSyncer) {
	// use lumberjack to rotate
	lumberJackLogger := &lumberjack.Logger{
		Filename: "D:\\demo1\\src\\demo\\demo06\\zap-log\\logs\\zap.log",
		MaxSize: 10, // filesize, MB
		MaxBackups: 7, // >7, than rotate
		MaxAge: 1, // frequency, 1 day
		Compress: false,
	}
	return zapcore.AddSync(lumberJackLogger)
}

func Info(message string, fields ...zap.Field) {
	callerFields := getCallerInfoForLog()
	fields = append(fields, callerFields...)
	logger.Info(message, fields...)
}

func Debug(message string, fields ...zap.Field) {
	callerFields := getCallerInfoForLog()
	fields = append(fields, callerFields...)
	logger.Debug(message, fields...)
}

func Error(message string, fields ...zap.Field) {
	callerFields := getCallerInfoForLog()
	fields = append(fields, callerFields...)
	logger.Error(message, fields...)
}

func Warn(message string, fields ...zap.Field) {
	callerFields := getCallerInfoForLog()
	fields = append(fields, callerFields...)
	logger.Warn(message, fields...)
}

func getCallerInfoForLog() (callerFields []zap.Field) {

	pc, file, line, ok := runtime.Caller(2) // 回溯两层,拿到写日志的调用方的函数信息
	if !ok {
		return
	}
	funcName := runtime.FuncForPC(pc).Name()
	funcName = path.Base(funcName) //Base函数返回路径的最后一个元素,只保留函数名

	callerFields = append(callerFields, zap.String("func", funcName), zap.String("file", file), zap.Int("line", line))
	return
}

main.go

package main

import (
	"go.uber.org/zap"
	"zap-log/zlog"
)

type user struct {
	Name string `json:"name"`
}

func main()  {
	user := &user{
		Name: "Kevin",
	}
	zlog.Info("test log", zap.Any("user", user))
}

posted on 2022-06-02 16:12  进击的davis  阅读(434)  评论(0编辑  收藏  举报

导航