0%

Logrus的使用

Logrus的使用

1.简介

github地址:https://github.com/sirupsen/logrus

Logrus是Go语言的一个开源的日志框架,与Go语言的标准日志库完全兼容。

Logrus特点:

  • Logrus包含7种日志级别:TraceLevelDebugLevelInfoLevelWarnLevelErrorLevelFatalLevelPanicLevel

  • 日志格式可以设置、框架中包含&logrus.JSONFormatter{}&logrus.TextFormatter{}

  • 线程安全

2.安装

1
go get github.com/sirupsen/logrus

3.使用

1.基本用法

1.写一个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package main

import log "github.com/sirupsen/logrus"

func main() {
log.Traceln("this is a demo") // 很细粒度的信息,一般用不到
log.Debugln("this is a demo") // 一般程序中输出的调试信息
log.Infoln("this is a demo") // 程序中输出的重要日志信息
log.Warnln("this is a demo") // 警告信息、提醒程序员注意
log.Errorln("this is a demo") // 错误日志信息、需要查看日志排查问题
log.Fatalln("this is a demo") // 致命错误,程序无法继续执行,打印日志、程序退出
log.Panicln("this is a demo") // 记录日志,程序panic
}

$ go run main.go
INFO[0000] this is a demo
WARN[0000] this is a demo
ERRO[0000] this is a demo
FATA[0000] this is a demo
exit status 1

输出该结果的原因:

  • logrus默认的输出级别为InfoLevel,对于TraceLevelDebugLevel就没有输出。
  • Panicln没有输出是因为在执行完log.Fatalln("this is a demo")程序就os.Exit(1)退出运行了

2.初始化配置

在使用Logrus之前,我们可以在init()函数中进行logrus的初始配置等等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import (
log "github.com/sirupsen/logrus"
"os"
)

func init(){
// 设置日志输出的格式信息 也可以使用log.TextFormatter{}
log.SetFormatter(&log.JSONFormatter{}) // JSON 格式输出日志信息
// 设置输出日志级别 TraceLevel < DebugLevel < InfoLevel < WarnLevel < ErrorLevel < FatalLevel < PanicLevel (此处比的大小仅仅为日志级别,不是枚举值的大小)
log.SetLevel(log.InfoLevel) // 高于或等于InfoLevel级别的日志信息
// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
// 日志消息输出可以是任意的io.writer类型
log.SetOutput(os.Stdout)
}

3.比较 TextFormatterJSONFormatter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import (
log "github.com/sirupsen/logrus"
"time"
)

func main() {
jsonFormat := log.New()
jsonFormat.SetFormatter(&log.JSONFormatter{})
jsonFormat.Info("JsonFormatter") // Json格式输出格式默认自带time输出信息
textFormat := log.New() //默认格式为TextFormatter格式
textFormat.Info("TextFormatter")
textFormat.WithFields(log.Fields{"time": time.Now()}).Info("使用Fields附带时间")
}
$ go run main.go
{"level":"info","msg":"JsonFormatter","time":"2021-07-23T14:37:38+08:00"}
INFO[0000] TextFormatter
INFO[0000] 使用Fields附带时间 fields.time="2021-07-23 14:37:38.507335 +0800 CST m=+0.000543956"

Process finished with exit code 0

TextFormatter格式输出的日志附带颜色JSONFormatter格式输出的日志信息附带时间信息。(上述使用了自定义Logger创建了两个log实例来进行对比)

对于日志输出的格式Logrus也支持引入第三方格式,我们这里介绍一个nested-logrus-formatter

1
2
3
4
5
6
7
8
9
10
11
12
13
import (
nested "github.com/antonfisher/nested-logrus-formatter"
log "github.com/sirupsen/logrus"
"time"
)
func main() {
log.SetFormatter(&nested.Formatter{
HideKeys: true, // 隐藏key
TimestampFormat: time.RFC3339, // 时间戳格式
FieldsOrder: []string{"component", "category"}, // Fields 字段排序
})
log.Info("this is a demo")
}

4.Hook 设置钩子

logrus可以设置钩子,每条日志输出前都会执行钩子的特定方法。所以,我们可以添加输出字段、根据级别将日志输出到不同的目的地。logrus也内置了一个syslog的钩子,将日志输出到syslog中。这里我们实现一个钩子,在输出的日志中增加一个appName = Demo字段。

logrus中Hook接口信息:

1
2
3
4
type Hook interface {
Levels() []Level
Fire(*Entry) error
}

需要我们实现这个接口的所有方法然后再设置钩子,举个栗子:(以下实现了上面接口的两个方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import 	log "github.com/sirupsen/logrus"
type DefaultFieldHook struct {
}

func (hook *DefaultFieldHook) Fire(entry *log.Entry) error {
entry.Data["appName"] = "Demo"
return nil
}

func (hook *DefaultFieldHook) Levels() []log.Level {
return log.AllLevels
}

func main() {
var hook log.Hook
hook = log.Hook(&DefaultFieldHook{})
log.AddHook(hook)
log.Info("this is a demo")
}

$ go run main.go
INFO[0000] this is a demo appName=Demo // TxetFormatter格式
{"appName":"Demo","level":"info","msg":"this is a demo","time":"2021-07-23T15:20:32+08:00"} // JSONFormatter格式
-------------本文结束再接再厉-------------

本文标题:Logrus的使用

文章作者:sicuni

发布时间:2021年07月23日 - 15:07

最后更新:2021年07月23日 - 08:07

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。