go:用zap和go-file-rotatelogs实现日志的记录和日志按时间分割

一,安装zap和go-file-rotatelogs两个库:

   1,安装zap:

liuhongdi@ku:/data/liuhongdi/zaplog$ go get -u go.uber.org/zap

  2,安装go-file-rotatelogs

liuhongdi@ku:/data/liuhongdi/zaplog2$ go get -u github.com/lestrrat/go-file-rotatelogs

  3,  go-file-rotatelogs的源码地址:

GitHub - lestrrat/go-file-rotatelogs: [MOVED] See github.com/lestrrat-go/file-rotatelogs

说明:刘宏缔的go森林是一个专注golang的博客,
网站:https://blog.imgtouch.com
原文: go:用zap和go-file-rotatelogs实现日志的记录和日志按时间分割 – 架构森林

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,演示项目的相关信息

1,项目地址:

   GitHub - liuhongdi/zaplog2: 用zap和go-file-rotatelogs实现日志的记录和日志按时间分割

三,代码说明

main.go

package main

import (
	"fmt"
	rotatelogs "github.com/lestrrat/go-file-rotatelogs"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"io"
	"net/http"
	"time"
)

var sugarLogger *zap.SugaredLogger

func main() {
	fmt.Println("begin main")
	InitLogger()
	defer sugarLogger.Sync()
	simpleHttpGet("www.cnblogs.com")
	simpleHttpGet("https://www.baidu.com")
}

//例子,http访问url,返回状态
func simpleHttpGet(url string) {
	fmt.Println("begin simpleHttpGet:"+url)
	sugarLogger.Debugf("Trying to hit GET request for %s", url)
	resp, err := http.Get(url)
	if err != nil {
		sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
	} else {
		sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)
		resp.Body.Close()
	}
}

func InitLogger() {
	encoder := getEncoder()

	//两个interface,判断日志等级
	//warnlevel以下归到info日志
	infoLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
		return lvl < zapcore.WarnLevel
	})
	//warnlevel及以上归到warn日志
	warnLevel := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
		return lvl >= zapcore.WarnLevel
	})

	infoWriter := getLogWriter("/data/liuhongdi/logs/zaplog2info")
	warnWriter := getLogWriter("/data/liuhongdi/logs/zaplog2warn")

	//创建zap.Core,for logger
	core := zapcore.NewTee(
		zapcore.NewCore(encoder, infoWriter, infoLevel),
		zapcore.NewCore(encoder, warnWriter, warnLevel),
	)
    //生成Logger
	logger := zap.New(core, zap.AddCaller())
	sugarLogger = logger.Sugar()
}

//getEncoder
func getEncoder() zapcore.Encoder {
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
	return zapcore.NewConsoleEncoder(encoderConfig)
}

//得到LogWriter
func getLogWriter(filePath string) zapcore.WriteSyncer {
	warnIoWriter := getWriter(filePath)
	return zapcore.AddSync(warnIoWriter)
}


//日志文件切割
func getWriter(filename string) io.Writer {
	// 保存日志30天,每24小时分割一次日志
	/*
	hook, err := rotatelogs.New(
		filename+"_%Y%m%d.log",
		rotatelogs.WithLinkName(filename),
		rotatelogs.WithMaxAge(time.Hour*24*30),
		rotatelogs.WithRotationTime(time.Hour*24),
	)
	*/
	//保存日志30天,每1分钟分割一次日志
	hook, err := rotatelogs.New(
		filename+"_%Y%m%d%H%M.log",
		rotatelogs.WithLinkName(filename),
		rotatelogs.WithMaxAge(time.Hour*24*30),
		rotatelogs.WithRotationTime(time.Minute*1),
	)
	if err != nil {
		panic(err)
	}
	return hook
}

四,测试效果

1,运行代码,控制台输出:

begin main
begin simpleHttpGet:www.cnblogs.com
begin simpleHttpGet:https://www.baidu.com

两个url地址中,第一个缺少协议,所以会生成错误日志,写到warn日志中,
另一个地址正确,会写到info日志中

2,查看日志文件内容:

root@ku:/data/liuhongdi/logs# more zaplog2warn_202011261853.log 
2020-11-26T18:53:18.846+0800	ERROR	zaplog2/main.go:29	Error fetching URL www.cnblogs.com : Error = Get "www.cnblogs.com": unsupported protocol schem
e ""

root@ku:/data/liuhongdi/logs# more zaplog2info_202011261853.log 
2020-11-26T18:53:18.845+0800	DEBUG	zaplog2/main.go:26	Trying to hit GET request for www.cnblogs.com
2020-11-26T18:53:18.846+0800	DEBUG	zaplog2/main.go:26	Trying to hit GET request for https://www.baidu.com
2020-11-26T18:53:24.011+0800	INFO	zaplog2/main.go:31	Success! statusCode = 200 OK for URL https://www.baidu.com

3,查看目录下的日志文件:  

root@ku:/data/liuhongdi/logs# ls -l
总用量 8
lrwxrwxrwx 1 liuhongdi liuhongdi  49 11月 26 18:53 zaplog2info -> /data/liuhongdi/logs/zaplog2info_202011261853.log
-rw-r--r-- 1 liuhongdi liuhongdi 636 11月 26 18:53 zaplog2info_202011261853.log
lrwxrwxrwx 1 liuhongdi liuhongdi  49 11月 26 18:53 zaplog2warn -> /data/liuhongdi/logs/zaplog2warn_202011261853.log
-rw-r--r-- 1 liuhongdi liuhongdi 306 11月 26 18:53 zaplog2warn_202011261853.log

可以看到go-file-rotatelogs实现日志切分时是使用了linux的符号链接,
日志切分时,把当前写入的符号链接指向另一个日志文件即可

五,查看go.mod中的版本信息:

module github.com/liuhongdi/zaplog2

go 1.15

require (
	github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f // indirect
	github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 // indirect
	github.com/pkg/errors v0.9.1 // indirect
	go.uber.org/multierr v1.6.0 // indirect
	go.uber.org/zap v1.16.0 // indirect
)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老刘你真牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值