🏆 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.WithFieldlogrus.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