Go语言 zap日志系统与gin继承

基本演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typescript复制代码var logger *zap.Logger

func main() {
initLogger()
// 在程序退出之前把缓冲区里的文件都刷到硬盘上
defer logger.Sync()
httpGet("https://www.baidu.com")
httpGet("https://www.google.com")
}

func initLogger() {
// 这里还可以New Develp环境的日志 只是输出格式不太一样
logger, _ = zap.NewProduction()
}

func httpGet(url string) {
resp, err := http.Get(url)
if err != nil {
logger.Error("Error fetching url..", zap.String("url", url), zap.Error(err))
} else {
logger.Info("Success..", zap.String("statusCode", resp.Status), zap.String("url", url))
resp.Body.Close()
}
}

image.png

定制Logger

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
go复制代码
var logger *zap.Logger

func main() {
initLogger()
// 在程序退出之前把缓冲区里的文件都刷到硬盘上
defer logger.Sync()
httpGet("https://www.baidu.com")
httpGet("https://www.google.com")
}

func initLogger() {
writeSync := getLogWriter()
encoder := getEncoder()
// 第三个参数 可以 指定从哪个级别开始输出日志
core := zapcore.NewCore(encoder, writeSync, zapcore.ErrorLevel)
logger = zap.New(core)

}

// 返回一个json编码的格式 一般情况下都用这个
func getEncoder() zapcore.Encoder {
return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
}

// 就是将日志写到何处
func getLogWriter() zapcore.WriteSyncer {
// 这里我们每次都是重新打开文件,你也可以用open和append来追加文件,免的每次写入文件 都会覆盖掉之前的
file, _ := os.Create("./test.log")
return zapcore.AddSync(file)
}

func httpGet(url string) {
resp, err := http.Get(url)
if err != nil {
logger.Error("Error fetching url..", zap.String("url", url), zap.Error(err))
} else {
logger.Info("Success..", zap.String("statusCode", resp.Status), zap.String("url", url))
resp.Body.Close()
}
}

image.png

这里的ts 代表时间戳,但是这个时间戳可读性是在是太差,当然也可以修改这个配置的

1
2
3
4
5
6
arduino复制代码// 返回一个json编码的格式 一般情况下都用这个
func getEncoder() zapcore.Encoder {
config := zap.NewProductionEncoderConfig()
config.EncodeTime = zapcore.ISO8601TimeEncoder
return zapcore.NewJSONEncoder(config)
}

image.png

我们甚至可以在日志中打印 是哪个方法 调用了日志所在的方法

image.png

只要修改如下的方法即可:

1
ini复制代码logger = zap.New(core,zap.AddCaller())

日志切割

如果一直向一个文件里面写入信息,文件会很快膨胀到xxx gb 这显然是无法忍受的,因此我们还需要日志切割归档功能

go get -u github.com/natefinch/lumberjack

1
2
3
4
5
6
7
8
9
10
go复制代码func getLogWriterByJack() zapcore.WriteSyncer {
logger := &lumberjack.Logger{
Filename: "./test.log",
MaxSize: 10,// 单位是mb
MaxBackups: 5,// 备份数量 切割文件之前 会把文件做备份
MaxAge: 30, // 备份天数
Compress: false, //默认不压缩
}
return zapcore.AddSync(logger)
}

写个测试函数测试一下

1
2
3
4
5
6
css复制代码for i := 0; i < 10000000; i++ {
//httpGet("https://www.baidu.com")
//httpGet("https://www.google.com")

logger.Info("i:")
}

image.png

在gin中 集成zap

这里类似的文章有很多 甚至也有人直接做好了类似的功能 github.com/gin-contrib…

有兴趣的可以体验下,很简单,就不再过多介绍了,有需要的话 大家记得取一下即可。

整体上来说 并不难,也就是实现对应的logger和recovery 而已,大家可以自行下载源码以后

稍微改动一下 然后来适配成自己的项目

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%