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