5.2 日志功能
日志的话需要先了解 logrus 包
https://pkg.go.dev/github.com/sirupsen/logrus#section-readme
5.2.1 logrus 包初体验
1.编写程序
package main
import "github.com/sirupsen/logrus"
func main() {
// 记录日志级别
logrus.Error("error")
logrus.Warning("warning")
logrus.Info("info")
logrus.Debug("debug")
}
2.执行程序
[16:41:55 root@go testlogrus]#go run main.go
ERRO[0000] error
WARN[0000] warning
INFO[0000] info
# 但是运行程序之后发现 debug 日志没出来
5.2.1.1 设置日志级别
所以我们想要设置他的日志级别,就可以通过 logrus.SetLevel()
package main
import "github.com/sirupsen/logrus"
func main() {
// 将日志级别设置为 debug
logrus.SetLevel(logrus.DebugLevel)
logrus.Error("error")
logrus.Warning("warning")
logrus.Info("info")
logrus.Debug("debug")
}
再次运行
[16:42:18 root@go testlogrus]#go run main.go
ERRO[0000] error
WARN[0000] warning
INFO[0000] info
DEBU[0000] debug
# debug 就输出了
5.2.1.2 设置日志格式
现在输出的是文本格式,但是有的时候我们需要将他输出为 json 格式
package main
import "github.com/sirupsen/logrus"
func main() {
logrus.SetLevel(logrus.DebugLevel)
// 设置为 json 格式
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.Error("error")
logrus.Warning("warning")
logrus.Info("info")
logrus.Debug("debug")
}
运行程序结果为 json
[16:44:42 root@go testlogrus]#go run main.go
{"level":"error","msg":"error","time":"2021-09-29T16:47:41+08:00"}
{"level":"warning","msg":"warning","time":"2021-09-29T16:47:41+08:00"}
{"level":"info","msg":"info","time":"2021-09-29T16:47:41+08:00"}
{"level":"debug","msg":"debug","time":"2021-09-29T16:47:41+08:00"}
5.2.1.3 开启文件调用
如果程序报错我们想知道他的具体位置就可以通过logrus.SetReportCaller(true)
true 表示开启
package main
import "github.com/sirupsen/logrus"
func main() {
logrus.SetLevel(logrus.DebugLevel)
// 设置为 json 格式
logrus.SetFormatter(&logrus.JSONFormatter{})
// 开启文件调用
logrus.SetReportCaller(true)
logrus.Error("error")
logrus.Warning("warning")
logrus.Info("info")
logrus.Debug("debug")
}
运行
[16:47:41 root@go testlogrus]#go run main.go
{"file":"/root/project/testlogrus/main.go:12","func":"main.main","level":"error","msg":"error","time":"2021-09-29T16:50:30+08:00"}
{"file":"/root/project/testlogrus/main.go:13","func":"main.main","level":"warning","msg":"warning","time":"2021-09-29T16:50:30+08:00"}
{"file":"/root/project/testlogrus/main.go:14","func":"main.main","level":"info","msg":"info","time":"2021-09-29T16:50:30+08:00"}
{"file":"/root/project/testlogrus/main.go:15","func":"main.main","level":"debug","msg":"debug","time":"2021-09-29T16:50:30+08:00"}
# 可以看到多了一个 "file":"/root/project/testlogrus/main.go:15"
5.2.1.4 将日志记录到文件
package main
import (
"os"
"github.com/sirupsen/logrus"
)
func main() {
// 创建追加文件
file, err := os.OpenFile("test.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
if err != nil {
logrus.Fatal(err)
}
defer file.Close()
// 将日志写入文件
logrus.SetOutput(file)
logrus.SetLevel(logrus.DebugLevel)
// 设置为 json 格式
logrus.SetFormatter(&logrus.JSONFormatter{})
// 开启文件调用
logrus.SetReportCaller(true)
logrus.Error("error")
logrus.Warning("warning")
logrus.Info("info")
logrus.Debug("debug")
}
执行程序已经记录
5.2.1.5 日志存储时间限制
但是 logrus 并没有对日志进行存储时间的记录,所以会随着时间的推移磁盘会被写满,这里我通过 lumberjack
来实现
https://pkg.go.dev/gopkg.in/natefinch/lumberjack.v2#section-readme
package main
import (
"github.com/sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
// 定义 lumberjack.Logger{} 结构体,因为 logrus.SetOutput 是一个接口接收的时候都是接收指针
logger := &lumberjack.Logger{
Filename: "test.log", // 日志文件名
MaxSize: 1, // 一个日志文件最大 1M,当然在工作中根据场景进行调整
MaxBackups: 7, // 最大保留 7 个文件
Compress: true, // 开启压缩功能
}
defer logger.Close()
// 将日志写入文件
logrus.SetOutput(logger)
logrus.SetLevel(logrus.DebugLevel)
// 设置为 json 格式
logrus.SetFormatter(&logrus.JSONFormatter{})
// 开启文件调用
logrus.SetReportCaller(true)
// 为了凸显日志多一点,这里循环 10 万次
for i := 0; i < 100000; i++ {
logrus.Error("error")
logrus.Warning("warning")
logrus.Info("info")
logrus.Debug("debug")
}
}
运行我们发现已经将日志保留了 7 份