golang 日志框架(zap)完整配置和使用

摘要:
目录结构:logger.go文件:packagelogimport(rotateloggs“github.com/lestrat-go/file rotatelogs”“go.uuber.org/zap”“go.ouber.org/zap/zapcore”“io”“os”“time”)varerrorLogger*zap。SugaredLoggerfuncinit(){//设置一些基本日志格式的特定含义

目录结构:

golang 日志框架(zap)完整配置和使用第1张

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")
}

免责声明:文章转载自《golang 日志框架(zap)完整配置和使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇windows下开启端口映射配置Nagios利用NSClient++监控Windows主机下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

nexus 3.17.0 做为golang 的包管理工具

nexus 3.17.0 新版本对于go 包管理的支持是基于go mod 的,同时我们也需要一个athens server 然后在nexus 中配置proxy 类型的repo 参考配置 来自官方的配置图 说明 就和上边说的一样,我们需要一个athens server,nexus 对于go mod 的支持就是通过配置proxy到athens server...

Golang的高级数据类型-切片(slice)实战篇

          Golang的高级数据类型-切片(slice)实战篇                              作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。        切片(slice)是Go中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合,切片是围绕动态数组的概念构建的,可以按需自动增长。   ...

Golang 编码规范

原文链接:https://github.com/golang/go/wiki/CodeReviewComments1)用 goimport 代替 gofmt2) https://golang.org/doc/effective_go.html#commentary注释单独一行,开始于描述的名字,结束于。。没看明白3)context.Context的值包含:...

golang gin框架使用swagger生成接口文档

前言 一份清晰明了的接口文档能够极大地提高前后端双方的沟通效率和开发效率。 本文将介绍如何使用swagger生成接口文档。 swagger介绍 Swagger本质上是一种用于描述使用JSON表示的RESTful API的接口描述语言。Swagger与一组开源软件工具一起使用,以设计、构建、记录和使用RESTful Web服务。Swagger包括自动文档,代...

go mod

golang 终于出官方版本管理机制,名为 go modules 初体验 使用前: # 先升级 golang 到 1.11 版本,然后 export GO111MODULE=on 在项目github.com/humboldt-xie/test-mod下,通过go mod init go mod init 然后会在当前项目目录下出现 go.mod 文件,内容...

[转]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误-高级

from : https://levy.at/blog/11 进阶篇 关闭HTTP的响应 level: intermediate 当你使用标准http库发起请求时,你得到一个http的响应变量。如果你不读取响应主体,你依旧需要关闭它。注意对于空的响应你也一定要这么做。对于新的Go开发者而言,这个很容易就会忘掉。 一些新的Go开发者确实尝试关闭响应主体,但...