golang zap日志使用


zap日志使用

package main

import (
	"encoding/json"
	"fmt"
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

func initLogger (logpath string,loglevel string) *zap.Logger {
	hook := lumberjack.Logger{
		Filename:   logpath,  //日志文件路徑
		MaxSize:    128, //最大字節
		MaxAge:     30,
		MaxBackups: 7,
		Compress:   true,
	}
	w := zapcore.AddSync(&hook)
	// 設置日志級別,debug可以打印出info,debug,warn;info級別可以打印warn,info;warn只能打印warn
    // debug->info->warn->error
    var level zapcore.Level
	switch loglevel {
	case "debug":
		level = zap.DebugLevel
	case "info":
		level= zap.InfoLevel
	case "error":
		level = zap.ErrorLevel
	default:
		level = zap.InfoLevel
	}

	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	core := zapcore.NewCore(
		zapcore.NewConsoleEncoder(encoderConfig),
		w,
		level,
	)

	logger := zap.New(core)
	logger.Info("DefaultLogger init success")
	return logger
}

type Person struct {
	Name string `json:"name"`
	Age int `json:"age"`
}

func main(){
	t:= &Person{
		Name: "zhangsan",
		Age:  21,
	}
	data,err := json.Marshal(t)
	if err!=nil {
		fmt.Println("marshal is failed,err:",err)
	}

	// 歷史記錄日志名字為:all-2018-11-15T07-45-51.763.log,服務重新啟動,日志會追加,不會刪除
	logger := initLogger("./all.log","debug")
	for i:=0;i<6;i++{
		//結構化日志輸出,即字段和消息
		//字段用來結構化輸出錯誤相關的上下文環境,而消息簡明扼要的闡述錯誤本身
		logger.Info(fmt.Sprint("test log",i),zap.Int("line",47))
		logger.Debug(fmt.Sprint("debug log",i),zap.ByteString("level",data))
		logger.Info(fmt.Sprint("Info log",i),zap.String("level",`{"a":"4","b":"5"}`))
		logger.Warn(fmt.Sprint("Info log ", i), zap.String("level", `{"a":"7","b":"8"}`))
		// 用戶不存在的錯誤消息
		logger.Error("User does not exist",zap.String("Name",t.Name))
	}
	//supgar的使用,不推薦,適合簡單使用
	sugar := logger.Sugar()
	sugar.Debugf("hello world : %s","zap-sugar")
}

示例代碼二

package logger

import (
	"os"
	"time"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	lumberjackv2 "gopkg.in/natefinch/lumberjack.v2"
)

const (
	Console = "console"
	File    = "file"
)

var (
	Leavel = zap.DebugLevel
	Target = Console
)

var (
	Logger *zap.Logger
	Sugar  *zap.SugaredLogger
)

func NewEncoderConfig() zapcore.EncoderConfig {
	return zapcore.EncoderConfig{
		// Keys can be anything except the empty string.
		TimeKey:        "T",
		LevelKey:       "L",
		NameKey:        "N",
		CallerKey:      "C",
		MessageKey:     "M",
		StacktraceKey:  "S",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.CapitalLevelEncoder,
		EncodeTime:     TimeEncoder,
		EncodeDuration: zapcore.StringDurationEncoder,
		EncodeCaller:   zapcore.ShortCallerEncoder,
	}
}

func TimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}

func init() {
	w := zapcore.AddSync(&lumberjackv2.Logger{
		Filename:   "log/im.log",
		MaxSize:    1024, // megabytes
		MaxBackups: 10,
		MaxAge:     7, // days
	})

	var writeSyncer zapcore.WriteSyncer
	if Target == Console {
		writeSyncer = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout))
	}
	if Target == File {
		writeSyncer = zapcore.NewMultiWriteSyncer(w)
	}

	core := zapcore.NewCore(
		zapcore.NewConsoleEncoder(NewEncoderConfig()),
		writeSyncer,
		Leavel,
	)
	Logger = zap.New(core, zap.AddCaller())
	Sugar = Logger.Sugar()
}

示例代碼三

package logger

import (
	"github.com/astaxie/beego"
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"os"
)

// 初始化zaplogger日志庫
var MyLogger *zap.Logger

func initLogger(logpath string) *zap.Logger {
	hook := lumberjack.Logger{
		Filename:   logpath, // 日志文件路徑
		MaxSize:    128,     // 每個日志文件保存的最大尺寸 單位:M
		MaxBackups: 30,      // 日志文件最多保存多少個備份
		MaxAge:     7,       // 文件最多保存多少天
		Compress:   true,    // 是否壓縮
	}

	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",
		LevelKey:       "level",
		NameKey:        "logger",
		CallerKey:      "linenum",
		MessageKey:     "msg",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.LowercaseLevelEncoder,  // 小寫編碼器
		EncodeTime:     zapcore.ISO8601TimeEncoder,     // ISO8601 UTC 時間格式
		EncodeDuration: zapcore.SecondsDurationEncoder, //
		EncodeCaller:   zapcore.ShortCallerEncoder,      // 短路徑編碼器
		EncodeName:     zapcore.FullNameEncoder,
	}

	// 設置日志級別
	atomicLevel := zap.NewAtomicLevel()
	atomicLevel.SetLevel(zap.DebugLevel)

	core := zapcore.NewCore(
		zapcore.NewJSONEncoder(encoderConfig),                                           // 編碼器配置
		zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // 打印到控制台和文件
		atomicLevel,                                                                     // 日志級別
	)

	// 開啟開發模式,堆棧跟蹤
	caller := zap.AddCaller()
	// 開啟文件及行號
	development := zap.Development()

	// 設置初始化字段
	filed := zap.Fields(zap.String("serviceName", "webgo"))
	// 構造日志
	logger := zap.New(core, caller, development, filed)

	logger.Info("log 初始化成功")
	return logger
}

// 初始化日志
func init() {
	logPath := beego.AppConfig.String("LogPath")
	MyLogger = initLogger(logPath)
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM