golang 不再使用原生的log, 使用固定的zap logger

最主要一点, zap的可以给出详细的log信息, 形如

2023-02-10T09:24:55.707+0800 INFO v3web/main.go:196 [2023-02-10 09:24:55]consumed=291254, total=24168775, timecost=20, speed=14562, avg=10886

 

这样就能非常方便的知道,日志所在的代码位置

 

logger/log.go

  1 package logger
  2 
  3 import (
  4     "os"
  5 
  6     "gopkg.in/natefinch/lumberjack.v2"
  7 
  8     "go.uber.org/zap"
  9     "go.uber.org/zap/zapcore"
 10 )
 11 
 12 var errorLogger *zap.SugaredLogger
 13 
 14 func init() {
 15     // 设置一些基本日志格式 具体含义还比较好理解,直接看zap源码也不难懂
 16     writeSyncer := getLogWriter()
 17     encoder := getEncoder()
 18     core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)
 19     logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
 20     errorLogger = logger.Sugar()
 21     //
 22     //encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
 23     //    MessageKey:  "msg",
 24     //    LevelKey:    "level",
 25     //    EncodeLevel: zapcore.CapitalLevelEncoder,
 26     //    TimeKey:     "ts",
 27     //    EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
 28     //        enc.AppendString(t.Format("2006-01-02 15:04:05"))
 29     //    },
 30     //    CallerKey:    "file",
 31     //    EncodeCaller: zapcore.ShortCallerEncoder,
 32     //    EncodeDuration: func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) {
 33     //        enc.AppendInt64(int64(d) / 1000000)
 34     //    },
 35     //})
 36     //// 实现两个判断日志等级的interface
 37     //infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
 38     //    return lvl >= zapcore.InfoLevel
 39     //})
 40     //errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
 41     //    return lvl >= zapcore.ErrorLevel
 42     //})
 43     //// 获取 info、error日志文件的io.Writer 抽象 getWriter() 在下方实现
 44     //infoWriter := getWriter("./logs/gossip.log")
 45     //errorWriter := getWriter("./logs/gossip_error.log")
 46     //// 最后创建具体的Logger
 47     //core := zapcore.NewTee(
 48     //    zapcore.NewCore(encoder, zapcore.AddSync(infoWriter), infoLevel),
 49     //    zapcore.NewCore(encoder, zapcore.AddSync(errorWriter), errorLevel),
 50     //)
 51     //log := zap.New(core, zap.AddCaller()) // 需要传入 zap.AddCaller() 才会显示打日志点的文件名和行数, 有点小坑
 52     //errorLogger = log.Sugar()
 53 }
 54 
 55 func getEncoder() zapcore.Encoder {
 56     encoderConfig := zap.NewProductionEncoderConfig()
 57     encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
 58     encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
 59     return zapcore.NewConsoleEncoder(encoderConfig)
 60 }
 61 
 62 func getLogWriter() zapcore.WriteSyncer {
 63     lumberJackLogger := &lumberjack.Logger{
 64         Filename:   "./app.log",
 65         MaxSize:    10, // 10M
 66         MaxBackups: 5,  // 5个
 67         MaxAge:     30, // 最多30天
 68         Compress:   false,
 69     }
 70     //return zapcore.AddSync(lumberJackLogger)
 71     return zapcore.NewMultiWriteSyncer(
 72         zapcore.AddSync(os.Stdout),
 73         zapcore.AddSync(lumberJackLogger))
 74 }
 75 
 76 func Debug(args ...interface{}) {
 77     errorLogger.Debug(args...)
 78 }
 79 func Debugf(template string, args ...interface{}) {
 80     errorLogger.Debugf(template, args...)
 81 }
 82 func Info(args ...interface{}) {
 83     errorLogger.Info(args...)
 84 }
 85 func Infof(template string, args ...interface{}) {
 86     errorLogger.Infof(template, args...)
 87 }
 88 func Warn(args ...interface{}) {
 89     errorLogger.Warn(args...)
 90 }
 91 func Warnf(template string, args ...interface{}) {
 92     errorLogger.Warnf(template, args...)
 93 }
 94 func Error(args ...interface{}) {
 95     errorLogger.Error(args...)
 96 }
 97 func Errorf(template string, args ...interface{}) {
 98     errorLogger.Errorf(template, args...)
 99 }
100 func DPanic(args ...interface{}) {
101     errorLogger.DPanic(args...)
102 }
103 func DPanicf(template string, args ...interface{}) {
104     errorLogger.DPanicf(template, args...)
105 }
106 func Panic(args ...interface{}) {
107     errorLogger.Panic(args...)
108 }
109 func Panicf(template string, args ...interface{}) {
110     errorLogger.Panicf(template, args...)
111 }
112 func Fatal(args ...interface{}) {
113     errorLogger.Fatal(args...)
114 }
115 func Fatalf(template string, args ...interface{}) {
116     errorLogger.Fatalf(template, args...)
117 }

 

在调用方的go.mod中

module logp_web

go 1.14

require (
    logger v0.0.0
)

replace logger => ./logger

 

再在调用方的代码中加入  import logger ,  就可以使用了

logger.Info

logger.Infof

 

posted on 2023-02-10 13:37  js.yeyong  阅读(69)  评论(0编辑  收藏  举报

导航