🏆 Logrus
⭐️ logrus
是一个 go
日志第三方库,由于 log
库实现的太简单,logrus
完全兼容标准的 log
库,还支持文本、JSON 两种日志输出格式。很多知名的开源项目都使用了这个库,如大名鼎鼎的 docker。
🌟 安装Logrus
go get github.com/sirupsen/logrus
安装完成之后就可以直接使用,在 logrus
中提供了很多日志的级别,有点类似于 linux
的日志级别,Trace
最大,Panic
最小
Panic
:记录日志,然后panic
。Fatal
:致命错误,出现错误时程序无法正常运转。输出日志后,程序退出;Error
:错误日志,需要查看原因;Warn
:警告信息,提醒程序员注意;Info
:关键操作,核心流程的日志;Debug
:一般程序中输出的调试信息;Trace
:很细粒度的信息,一般用不到;
在代码中实现,注意: 现在你只能看到 info
级别以下的日志, 因为它默认有一个日志等级显示,高于这个等级的不会显示默认就是 info
package main
import "github.com/sirupsen/logrus"
func main() {
logrus.Trace("Trace logs")
logrus.Info("Info logs")
logrus.Warn("Warn logs")
logrus.Debug("Debug logs")
logrus.Fatal("Fatal logs")
logrus.Error("Error logs")
logrus.Panic("panic logs")
}
需要通过 logrus.SetLevel(logrus.TraceLevel)
配置
func main() {
logrus.SetLevel(logrus.TraceLevel)
logrus.Trace("trace msg")
logrus.Debug("debug msg")
logrus.Info("info msg")
logrus.Warn("warn msg")
logrus.Error("error msg")
logrus.Fatal("fatal msg")
logrus.Panic("panic msg")
}
配置完成后运行
time="2024-06-25T13:02:50+08:00" level=trace msg="trace msg"
time="2024-06-25T13:02:50+08:00" level=debug msg="debug msg"
time="2024-06-25T13:02:50+08:00" level=info msg="info msg"
time="2024-06-25T13:02:50+08:00" level=warning msg="warn msg"
time="2024-06-25T13:02:50+08:00" level=error msg="error msg"
time="2024-06-25T13:02:50+08:00" level=fatal msg="fatal msg"
exit status 1
logrus.Fatal
会导致程序退出,下面的 logrus.Panic
不会执行到。
🌟定制日志内容
🍵 输出报错文件名:
func main() {
logrus.SetReportCaller(true)
logrus.Trace("trace msg")
}
输入如下格式
time="2024-06-25T13:05:24+08:00" level=trace msg="trace msg" func=main.main file="D:/learnCode/Go/GoWeb/Go_logrus/main.go:16"
🍵 定制日志输出内容
⭐️ 调用 logrus.WithField
和 logrus.WithFields
实现。logrus.WithFields
接受一个 logrus.Fields
类型的参数,其底层实际上为 map[string]interface{}
``WithFields 返回一个
logrus.Entry 类型的值,它将
logrus.Logger 和设置的
logrus.Fields 保存下来。调用
Entry 相关方法输出日志时,保存下来的
logrus.Fields`也会随之输出
//WithFields 源代码
func WithFields(fields Fields) *Entry {
return std.WithFields(fields)
}
使用
func main() {
logrus.SetLevel(logrus.TraceLevel)
logrus.WithFields(logrus.Fields{
"APP": "Logrus",
"IP": "localhost",
}).Info("Starting")
}
输出
time="2024-06-25T13:11:40+08:00" level=info msg=Starting APP=Logrus IP=localhost
🍵 将日志输出到文件中
默认情况下,日志输出到 io.Stderr
。可以调用 logrus.SetOutput
传入一个 io.Writer
参数。后续调用相关方法日志将写到 io.Writer
中
func main() {
//重定向输出到文件
writer1 := &bytes.Buffer{}
writer2 := os.Stdout
writer3, err := os.OpenFile("log.txt", os.O_WRONLY|os.O_CREATE, 0755)
if err != nil {
log.Fatalf("create file log.txt failed: %v", err)
}
logrus.SetOutput(io.MultiWriter(writer1, writer2, writer3))
logrus.Info("info msg")
}
🍵 日志格式
logrus
支持两种日志格式,文本和 JSON,默认为文本格式。可以通过 logrus.SetFormatter
设置日志格式
package main
import (
"github.com/sirupsen/logrus"
)
func main() {
logrus.SetLevel(logrus.TraceLevel)
logrus.SetFormatter(&logrus.JSONFormatter{})
logrus.Trace("trace msg")
logrus.Debug("debug msg")
logrus.Info("info msg")
logrus.Warn("warn msg")
logrus.Error("error msg")
logrus.Fatal("fatal msg")
logrus.Panic("panic msg")
}
🍵 Hook
还可以为 logrus
设置钩子,每条日志输出前都会执行钩子的特定方法。所以,我们可以添加输出字段、根据级别将日志输出到不同的目的地。
logrus
也内置了一个 syslog
的钩子,将日志输出到 syslog
中。这里我们实现一个钩子,在输出的日志中增加一个 app=awesome-web
字段。
实现Hook需要实现,Hook接口,Levels()
方法返回感兴趣的日志级别,输出其他日志时不会触发钩子。Fire
是日志输出前调用的钩子方法。
// github.com/sirupsen/logrus/hooks.go
type Hook interface {
Levels() []Level
Fire(*Entry) error
}
代码
type StringHook struct {
AppName string
}
//实现接口
func (This *StringHook) Levels() []logrus.Level {
level := make([]logrus.Level, 0)
level = append(level, logrus.WarnLevel)
return level
}
func (This *StringHook) Fire(entry *logrus.Entry) error {
entry.Data["app"] = This.AppName
return nil
}
func main() {
//hook
logrus.AddHook(&StringHook{AppName: "Logrus"})
logrus.Info("INFO")
logrus.Warn("WARN")
}
输出:
time="2024-06-25T15:45:34+08:00" level=info msg=INFO
time="2024-06-25T15:45:34+08:00" level=warning msg=WARN app=Logrus