zap 自定义日志格式_go日志归档(基于zap)

17aebb0ac5ca44749822b0acfce894e3.png
wzyonggege/logger​github.com
f7564d41c9a935cccd790669e228e705.png

实现一个基于 uber-go/zap 日志功能的日志文件归档模块

  • 分级归档,可按info/error分开存放日志
  • 按日志文件大小归档
  • 按时间间隔归

1. 分级归档

zap 本身支持日志分级,在写入文件的时候选择好输出路径

2. 按文件大小

文件大小切割借助了第三方库 lumberjack ,可以选择文件的大小来切割

(LogOptions 中存放一些配置)

func (c *LogOptions) sizeDivisionWriter(filename string) io.Writer {
	hook := &lumberjack.Logger{
		Filename:   filename,
		MaxSize:    c.MaxSize,
		MaxBackups: c.MaxBackups,
		MaxAge:     c.MaxSize,
		Compress:   c.Compress,
	}
	return hook
}

3. 按时间切割

按时间切割可是借助到了第三方的库file-rotatelogs

func (c *LogOptions) timeDivisionWriter(filename string) io.Writer {
	hook, err := rotatelogs.New(
		filename+c.TimeUnit.Format(),
		rotatelogs.WithMaxAge(time.Duration(int64(24*time.Hour)*int64(c.MaxAge))),
		rotatelogs.WithRotationTime(c.TimeUnit.RotationGap()),
	)

	if err != nil {
		panic(err)
	}
	return hook
}

LogOptions的TimeUnit可以选择切割单元,例如按小时切割的日志为server.log.2019091123

4. 使用

c := logger.New()
c.SetDivision("time")       // 设置归档方式,"time"时间归档 "size" 文件大小归档,文件大小等可以在配置文件配置
c.SetTimeUnit(logde.Minute) // 时间归档 可以设置切割单位
c.SetEncoding("json")       // 输出格式 "json" 或者 "console"

c.SetInfoFile("./logs/server.log")      // 设置info级别日志
c.SetErrorFile("./logs/server_err.log") // 设置warn级别日志
c.InitLogger()

logger.Info("info level test")
logger.Info("this is a log", logger.With("Trace", "12345677")) // 带参数
logger.Error("this is a log", logger.WithError("error", errors.New("this is a new error"))) // 带error

5. Benchmark

再写个简单的benchmark

BenchmarkLogger/logde_logger_without_fields-4            3000000               563 ns/op
BenchmarkLogger/logde_logger_with_fields-4               2000000               637 ns/op
BenchmarkLogger/logde_logger_without_fields_write_into_file-4             200000             13021 ns/op
BenchmarkLogger/logde_logger_with_fields_write_into_file-4                100000             12606 ns/op

6. 结尾

放上 GitHub 地址: https://github.com/wzyonggege/logger

写得粗略,慢慢改改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值