zoukankan      html  css  js  c++  java
  • golang 日志框架(zap)完整配置和使用

    目录结构:

    logger.go文件:

    package log
    
    import (
        rotatelogs "github.com/lestrrat-go/file-rotatelogs"
        "go.uber.org/zap"
        "go.uber.org/zap/zapcore"
        "io"
        "os"
        "time"
    )
    
    var errorLogger *zap.SugaredLogger
    
    func init() {
        // 设置一些基本日志格式 具体含义还比较好理解,直接看zap源码也不难懂
        encoder := zapcore.NewConsoleEncoder(zapcore.EncoderConfig{
            MessageKey:  "msg",
            LevelKey:    "level",
            EncodeLevel: zapcore.CapitalLevelEncoder,
            TimeKey:     "ts",
            EncodeTime: func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
                enc.AppendString(t.Format("2006-01-02 15:04:05"))
            },
            CallerKey:    "file",
            EncodeCaller: zapcore.ShortCallerEncoder,
            EncodeDuration: func(d time.Duration, enc zapcore.PrimitiveArrayEncoder) {
                enc.AppendInt64(int64(d) / 1000000)
            },
        })
    
        // 实现两个判断日志等级的interface
        infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
            return lvl >= zapcore.InfoLevel
        })
    
        errorLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
            return lvl >= zapcore.ErrorLevel
        })
    
        // 获取 info、error日志文件的io.Writer 抽象 getWriter() 在下方实现
        infoWriter := getWriter("./logs/info.log")
        errorWriter := getWriter("./logs/error.log")
    
        // 最后创建具体的Logger
        core := zapcore.NewTee(
            zapcore.NewCore(encoder, zapcore.AddSync(os.Stdout), infoLevel), //打印到控制台
            zapcore.NewCore(encoder, zapcore.AddSync(infoWriter), infoLevel),
            zapcore.NewCore(encoder, zapcore.AddSync(errorWriter), errorLevel),
        )
    
        log := zap.New(core, zap.AddCaller()) // 需要传入 zap.AddCaller() 才会显示打日志点的文件名和行数, 有点小坑
        errorLogger = log.Sugar()
    }
    
    func getWriter(filename string) io.Writer {
        // 生成rotatelogs的Logger 实际生成的文件名 info.log.YYmmddHH
        // info.log是指向最新日志的链接
        // 保存7天内的日志,每1小时(整点)分割一次日志
        hook, err := rotatelogs.New(
            filename+".%Y%m%d%H", // 没有使用go风格反人类的format格式
            rotatelogs.WithLinkName(filename),
            rotatelogs.WithMaxAge(time.Hour*24*7),
            rotatelogs.WithRotationTime(time.Hour),
        )
    
        if err != nil {
            panic(err)
        }
        return hook
    }
    func Debug(args ...interface{}) {
        errorLogger.Debug(args...)
    }
    
    func Debugf(template string, args ...interface{}) {
        errorLogger.Debugf(template, args...)
    }
    
    func Info(args ...interface{}) {
        errorLogger.Info(args...)
    }
    
    func Infof(template string, args ...interface{}) {
        errorLogger.Infof(template, args...)
    }
    
    func Warn(args ...interface{}) {
        errorLogger.Warn(args...)
    }
    
    func Warnf(template string, args ...interface{}) {
        errorLogger.Warnf(template, args...)
    }
    
    func Error(args ...interface{}) {
        errorLogger.Error(args...)
    }
    
    func Errorf(template string, args ...interface{}) {
        errorLogger.Errorf(template, args...)
    }
    
    func DPanic(args ...interface{}) {
        errorLogger.DPanic(args...)
    }
    
    func DPanicf(template string, args ...interface{}) {
        errorLogger.DPanicf(template, args...)
    }
    
    func Panic(args ...interface{}) {
        errorLogger.Panic(args...)
    }
    
    func Panicf(template string, args ...interface{}) {
        errorLogger.Panicf(template, args...)
    }
    
    func Fatal(args ...interface{}) {
        errorLogger.Fatal(args...)
    }
    
    func Fatalf(template string, args ...interface{}) {
        errorLogger.Fatalf(template, args...)
    }

    使用方法:

    main.go

    package main
    
    import log "svctest/logger"
    
    func main() {
        log.Info("aaaaa")
        log.Warn("bbb")
        log.Error("accc")
    }
    人生如修仙,岂是一日间。何时登临顶,上善若水前。
  • 相关阅读:
    double类型比大小的故事
    研究TR1中的东西方向啊方向
    About DWMAPI.DLL
    谈谈Windows程序中的字符编码
    [收藏]使用Microsoft Visual C++来检测和隔离内存泄漏
    浅谈文字编码和Unicode(下)
    【NYOJ】[169]素数
    [bbk5222] 第111集 第14章 数据库空间管理 00
    Redo Log
    平台移植项目案例 32bit windows9i > 64bit suse linux 10g
  • 原文地址:https://www.cnblogs.com/f-society/p/13681733.html
Copyright © 2011-2022 走看看