背景:
当前项目需要,因为在项目部署后,会持续的产生大量的日志,那么其中最重要的就是我们所说的内存消耗问题了,一旦部署服务器,会每时每刻的产生日志,随着时间的推移,可能日志就会达到相当大的内存。如果项目很多可能堆积的大量日志会导致系统服务无法使用
我就是根据这个需求,在网上找了一些相关的公共log包,看看有没有什么可以使用的,发现其中zap包性能和使用上面最为方便,下面就具体介绍相关的使用:(springBoot的log已经解决了这个问题,前面的博客已经进行了说明)
首先:
该包的优势:
zap的包主要就是性能强大,同时可以看出,该包可以根据用户的需求进行自定义设计,例如,可以配置文件多大进行打包压缩包,同时多久可以自动的清除文件。会保存最新的文件,而自动的产出过期的文件,过期日期自定义设定。
需要的依赖包:
"go.uber.org/zap" "go.uber.org/zap/zapcore"
然后写相关的logger.go文件,具体的内容如下:(该文件我是在项目的文件夹中建立文件夹log,然后在里面建立文件,里面的东西可以直接使用,唯一需要改动的就是
filePath: 文件的名称
configFilePath : 文件夹的路径
。。。需要配置的可以将这部分内容配置到我们的项目配置文件中
)
package log
import (
"fmt"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"os"
"strings"
)
// error logger
var errorLogger *zap.SugaredLogger
var levelMap = map[string]zapcore.Level{
"debug": zapcore.DebugLevel,
"info": zapcore.InfoLevel,
"warn": zapcore.WarnLevel,
"error": zapcore.ErrorLevel,
"dpanic": zapcore.DPanicLevel,
"panic": zapcore.PanicLevel,
"fatal": zapcore.FatalLevel,
}
func getLoggerLevel(lvl string) zapcore.Level {
if level, ok := levelMap[lvl]; ok {
return level
}
return zapcore.InfoLevel
}
func init() {
filePath := "log.log"
// configFilePath 文件夹位置
configFilePath := "./logs"
if configFilePath != "" {
if strings.HasSuffix(configFilePath, "/") { //判断是否以/结尾
filePath = configFilePath + filePath
} else {
filePath = configFilePath + "/" + filePath
}
}
configLogLevel := "INFO" //等级
fmt.Printf("log.level:%s\n", configLogLevel)
level := getLoggerLevel(configLogLevel) //日志等级
hook := lumberjack.Logger{
Filename: filePath, // 日志文件路径
MaxSize: 128, // 每个日志文件保存的最大尺寸 单位:M
//LocalTime: true,
MaxBackups: 100, // 日志文件最多保存多少个备份
MaxAge: 30, // 文件最多保存多少天
Compress: true, // 是否压缩
}
syncWriter := zapcore.AddSync(&hook)
highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.ErrorLevel
})
lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl < zapcore.ErrorLevel
})
encoder := zap.NewProductionEncoderConfig()
encoder.EncodeTime = zapcore.ISO8601TimeEncoder
consoleDebugging := zapcore.Lock(os.Stdout)
consoleErrors := zapcore.Lock(os.Stderr)
consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
core := zapcore.NewTee(
zapcore.NewCore(zapcore.NewJSONEncoder(encoder), syncWriter, zap.NewAtomicLevelAt(level)),
zapcore.NewCore(consoleEncoder, consoleErrors, highPriority),
zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority),
)
logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
errorLogger = logger.Sugar()
}
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...)
}
下面就是相关的测试用例:
func Test14(t *testing.T) {
logger.Infof("Hello")
logger.Info("World!!")
logger.Debug("World!!")
logger.Error("World!!")
}
测试结果如下:
log.level:INFO
=== RUN Test14
2020-11-26T13:46:02.555+0800 INFO test/gotmGao_test.go:125 Hello
2020-11-26T13:46:02.571+0800 INFO test/gotmGao_test.go:126 World!!
2020-11-26T13:46:02.571+0800 DEBUG test/gotmGao_test.go:127 World!!
2020-11-26T13:46:02.571+0800 ERROR test/gotmGao_test.go:128 World!!
自动创建的文件夹和相关的文件: