[js go]zap日志记录与切割备份

285 阅读1分钟

使用zap记录日志, 使用lumberjack切割备份日志

为什么使用这个方案

  1. 性能好
  2. 详细的日志级别
  3. 记录函数调用, 代码行数
  4. 格式化时间
  5. 输出到文件
package main

import (
	"github.com/natefinch/lumberjack"
	"net/http"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

var sugarLogger *zap.SugaredLogger

func main() {
	InitLogger()
	defer sugarLogger.Sync()
	for i:= 0; i < 10000; i++ {
		go func () {
			simpleHttpGet("www.google.com")
			simpleHttpGet("http://www.google.com")
		}()
	}
}

func InitLogger() {
	writeSyncer := getLogWriter()
	encoder := getEncoder()
	core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)
	logger := zap.New(core, zap.AddCaller()) // 添加函数调用信息
	sugarLogger = logger.Sugar() // 更友好的日志, 但有额外性能
}

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

func getLogWriter() zapcore.WriteSyncer {
	lumberJackLogger := &lumberjack.Logger{
		Filename:   "./test.log", // 日志路径
		MaxSize:    1, // 达到多少Mb会切割
		MaxBackups: 5, // 备份数量
		MaxAge:     30, // 备份天数
		Compress:   false, // 是否压缩
	}
	return zapcore.AddSync(lumberJackLogger)
}

func simpleHttpGet(url string) {
	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()
	}
}

输出的日志

切割与备份