logrus 日志框架
下载:
go get -u github.com/sirupsen/logrus
1 logrus常用方法
logrus.Debugln("Debugln")
logrus.Infoln("Infoln")
logrus.Warnln("Warnln")
logrus.Errorln("Errorln")
logrus.Println("Println")
// 输出如下
time="2022-12-17T14:02:01+08:00" level=info msg=Infoln
time="2022-12-17T14:02:01+08:00" level=warning msg=Warnln
time="2022-12-17T14:02:01+08:00" level=error msg=Errorln
time="2022-12-17T14:02:01+08:00" level=info msg=Println
debug的没有输出,是因为logrus默认的日志输出等级是 info
fmt.Println(logrus.GetLevel()) // info
- 日志等级
PanicLevel // 会抛一个异常
FatalLevel // 打印日志之后就会退出
// ===============
// 常用以下4个
ErrorLevel
WarnLevel
InfoLevel
DebugLevel
// ===============
TraceLevel // 低级别
更改日志级别
如果你想显示Debug的日志,那么你可以更改日志显示等级
logrus.SetLevel(logrus.DebugLevel)
日志级别一般是和系统环境挂钩,例如开发环境,肯定就要显示debug信息,测试环境也是需要的
线上环境就不需要这些日志,可能只显示warnning的日志
设置特定字段
package main
import "github.com/sirupsen/logrus"
func main() {
log := logrus.WithField("project", "study")
log2 := logrus.WithFields(logrus.Fields{
"animal": "walrus",
"size": 10,
})
log.Info("hello")
// time="2023-11-03T10:13:14+08:00" level=info msg=hello project=study
log2.Info("hello")
// time="2023-11-03T10:13:14+08:00" level=info msg=hello animal=walrus size=10
// 可以链式
log3 := logrus.WithField("animal", "walrus").WithField("size", 10)
log3.Info("hello link")
// time="2023-11-03T10:15:50+08:00" level=info msg="hello link" animal=walrus size=10
// log2也可以链式
}
通常,在一个应用中、或者应用的一部分中,都有一些固定的Field。
比如在处理用户http请求时,上下文中,所有的日志都会有request_id和user_ip
为了避免每次记录日志都要使用log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}),我们可以创建一个logrus.Entry实例,为这个实例设置默认Fields,在上下文中使用这个logrus.Entry实例记录日志即可。
显示样式 Text和Json
默认的是以text的形式展示,也可以设置为json
logrus.SetFormatter(&logrus.JSONFormatter{})
log1 := logrus.WithField("project", "study")
log1.Errorln("hello")
// {"level":"error","msg":"hello","project":"study","time":"2022-12-17T15:08:24+08:00"}
自定义颜色
-
如果我们想要在控制中显示颜色,一般的做法都是使用ANSI 控制码,用于设置文本颜色。
-
\033 是控制码的开始,是八进制数字,[31m 表示将文本设置为红色。
-
ANSI 控制码是用于在终端和控制台中控制文本格式和颜色的一种标准。它们通常用于在命令行界面 (CLI) 程序中输出彩色文本或者在文本模式下的图形界面 (GUI) 中输出文本。
func main() {
// 前景色
fmt.Println("\033[30m 黑色 \033[0m")
fmt.Println("\033[31m 红色 \033[0m")
fmt.Println("\033[32m 绿色 \033[0m")
fmt.Println("\033[33m 黄色 \033[0m")
fmt.Println("\033[34m 蓝色 \033[0m")
fmt.Println("\033[35m 紫色 \033[0m")
fmt.Println("\033[36m 青色 \033[0m")
fmt.Println("\033[37m 灰色 \033[0m")
// 背景色
fmt.Println("\033[40m 黑色 \033[0m")
fmt.Println("\033[41m 红色 \033[0m")
fmt.Println("\033[42m 绿色 \033[0m")
fmt.Println("\033[43m 黄色 \033[0m")
fmt.Println("\033[44m 蓝色 \033[0m")
fmt.Println("\033[45m 紫色 \033[0m")
fmt.Println("\033[46m 青色 \033[0m")
fmt.Println("\033[47m 灰色 \033[0m")
}
输出到日志文件
默认的输出是在控制台上
但是后期想要找某些日志,翻控制台可能就不太好找了
使用这个函数即可func SetOutput(out io.Writer)
,需要我们有一个Writer
的对象
file, _ := os.OpenFile("info.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
logrus.SetOutput(file)
同时输出屏幕和文件
package main
import (
"github.com/sirupsen/logrus"
"io"
"os"
)
func main() {
// 设置output,默认为stderr,可以为任何io.Writer,比如文件*os.File
file, _ := os.OpenFile("checkemstools.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
// 同时写文件和屏幕
logrus.SetOutput(io.MultiWriter(file, os.Stdout))
logrus.SetLevel(logrus.DebugLevel)
logrus.Debug("debug")
logrus.Info("info")
logrus.Warn("warn")
logrus.Error("error")
logrus.Fatal("fatal")
logrus.Panic("panic")
}