Golang成长之路:使用Zap来做日志服务

我们在项目中,经常会记录一些数据信息到文件中,或者日志文件。

例如nginx会有nginx访问请求日志,使用golang的时候,我也想做一个这样的访问日志,所以我就找到了go的一个开源高效的日志库zap。

很多人也使用logrus或者go自带的Logger(支持的东西太少,性能一般),具体为啥最后选择了zap,是因为很多人说zap性能更高些,当然我自己没有测试过。

 

1、安装zap

go get -u go.uber.org/zap

如果没反应,可能需要配置下代理,

go env -w GOPROXY=https://goproxy.cn

然后在执行安装的命令。

 

2、简单实例(默认配置)

Zap提供了两种类型的日志记录器—Sugared LoggerLogger

package main

import (
    "go.uber.org/zap"
    "time"
)

func main() {
    // zap.NewDevelopment 格式化输出
    logger, _ := zap.NewDevelopment()
    defer logger.Sync()
    logger.Info("测试",
        zap.String("url", "http://www.baidu.com"),
        zap.Int("attempt", 3),
        zap.Duration("backoff", time.Second),
    )

    // zap.NewProduction json序列化输出
    logger, _ := zap.NewProduction()
    defer logger.Sync()
    logger.Info("测试",
        zap.String("url", "http://www.baidu.com"),
        zap.Int("attempt", 3),
        zap.Duration("backoff", time.Second),
    )
}

3、自定义配置

 封装好一个logger包

package logger
 
import (
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "time"
    "fmt"
)
 
var sugarLogger *zap.SugaredLogger

//格式化日期
func formatEncodeTime(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(fmt.Sprintf("%d-%02d-%02d %02d:%02d:%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second()))
}

func InitConfig() *zap.SugaredLogger {
  	encoderConfig := zapcore.EncoderConfig{
        TimeKey:        "ts",
        LevelKey:       "level",
        NameKey:        "logger",
        CallerKey:      "caller",
        MessageKey:     "msg",
        StacktraceKey:  "stacktrace",
        LineEnding:     zapcore.DefaultLineEnding,
        EncodeLevel:    zapcore.LowercaseLevelEncoder,  // 小写编码器
        EncodeTime:     formatEncodeTime,     		//时间格式
        EncodeDuration: zapcore.SecondsDurationEncoder,
        EncodeCaller:   zapcore.FullCallerEncoder,      // 全路径编码器
    }

    // 设置日志级别(默认info级别,可以根据需要设置级别)
    atom := zap.NewAtomicLevelAt(zap.InfoLevel)

    config := zap.Config{
        Level:            atom,                                                // 日志级别
        Development:      true,                                                // 开发模式,堆栈跟踪
        Encoding:         "json",                                              // 输出格式 console 或 json
        EncoderConfig:    encoderConfig,                                       // 编码器配置
        OutputPaths:      []string{"stdout", '需要写入文件的路径'},         	   // 日志写入文件的地址
        ErrorOutputPaths: []string{"stderr", '需要写入文件的路径'},		   // 将系统内的error记录到文件的地址
    }

    // 构建日志
    logger, _ := config.Build()
    sugarLogger  = logger.Sugar()
    return sugarLogger 
}
 
func Debug(args ...interface{}) {
	sugarLogger.Debug(args...)
}
 
func Debugf(template string, args ...interface{}) {
	sugarLogger.Debugf(template, args...)
}
 
func Info(args ...interface{}) {
	sugarLogger.Info(args...)
}
 
func Infof(template string, args ...interface{}) {
	sugarLogger.Infof(template, args...)
}

func Infow(template string, args ...interface{}) {
	sugarLogger.Infow(template, args...)
}

func Warn(args ...interface{}) {
	sugarLogger.Warn(args...)
}
 
func Warnf(template string, args ...interface{}) {
	sugarLogger.Warnf(template, args...)
}
 
func Error(args ...interface{}) {
	sugarLogger.Error(args...)
}
 
func Errorf(template string, args ...interface{}) {
	sugarLogger.Errorf(template, args...)
}
 
func DPanic(args ...interface{}) {
	sugarLogger.DPanic(args...)
}
 
func DPanicf(template string, args ...interface{}) {
	sugarLogger.DPanicf(template, args...)
}
 
func Panic(args ...interface{}) {
	sugarLogger.Panic(args...)
}
 
func Panicf(template string, args ...interface{}) {
	sugarLogger.Panicf(template, args...)
}
 
func Fatal(args ...interface{}) {
	sugarLogger.Fatal(args...)
}
 
func Fatalf(template string, args ...interface{}) {
	sugarLogger.Fatalf(template, args...)
}

EncoderConfig配置说明

MessageKey:输入信息的key名
LevelKey:输出日志级别的key名
TimeKey:输出时间的key名
NameKey CallerKey StacktraceKey跟以上类似,看名字就知道
LineEnding:每行的分隔符。基本zapcore.DefaultLineEnding 即"\n"
EncodeLevel:基本zapcore.LowercaseLevelEncoder。将日志级别字符串转化为小写
EncodeTime:输出的时间格式
EncodeDuration:一般zapcore.SecondsDurationEncoder,执行消耗的时间转化成浮点型的秒
EncodeCaller:一般zapcore.ShortCallerEncoder,以包/文件:行号 格式化调用堆栈
EncodeName:可选值。

 

使用案例

package main

import (
	"logger"//导入写好的包(具体需要改为自己写的路径)
)

func main() {
	//初始化日志配置
	logger.InitConfig()

	//写入文件
	logger.Infow("access_log",
		"code", 200,
		"ip", 192.168.1.1,
		"Method", "POST",
		"url", "www.baidu.com",
		"latencyTime(ms)", 1000,
	)
}

 

好了,这就是自己捣鼓的zap使用方法,希望能帮助到大家吧。

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值