golang常用库:日志记录库-logrus使用

它是一个结构化、插件化的日志记录库。完全兼容 golang 标准库中的日志模块。它还内置了 2 种日志输出格式 JSONFormatter 和 TextFormatter,来定义输出的日志格式。

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

logrus 使用

使用的版本:logrus v1.8.1

1. 开始使用 package main import ( log "github.com/sirupsen/logrus" ) func main() { log.WithFields(log.Fields{ "animal": "walrus", }).Info("a walrus appears") }

运行输出:

time="2021-11-11T17:41:48+08:00" level=info msg="a walrus appears" animal=walrus 2. 设置日志格式,日志级别,输出方式 设置日志格式

1)内置日志格式

,logrus内置的formatter有 2 种,logrus.TextFormatter 和 logrus.JSONFormatter

logrus.JSONFormatter{}, 设置为 json 格式,所有设置选项在

log.SetFormatter(&log.JSONFormatter{ TimestampFormat: "2006-01-02 15:04:05", // 设置json里的日期输出格式 }) log.SetFormatter(&log.JSONFormatter{}) // 设置为json格式

logrus.TextFormatter{},设置为文本格式,所有的设置选项在

log.SetFormatter(&log.TextFormatter{ TimestampFormat: "2006-01-02 15:04:05", ForceColors: true, EnvironmentOverrideColors: true, // FullTimestamp:true, // DisableLevelTruncation:true, })

2)自定义日志格式

可以根据 接口自定义日志格式,里面有一个 Format 方法,这个 Format 方法里有一个struct类型数据 , Entry.Data 是所有字段集合, 类型为 map[string]interface{}。

比如:entry.Data["msg"],entry.Data["time"]`. The timestamp

package main import ( "fmt" jsoniter "github.com/json-iterator/go" log "github.com/sirupsen/logrus" ) type MyJSONFormatter struct { JSONPrefix string Otherdata string } func (my *MyJSONFormatter) Format(entry *log.Entry) ([]byte, error) { // fmt.Println(entry.Data["msg"]) entry.Data["msg"] = fmt.Sprintf("%s%s", my.JSONPrefix, my.Otherdata) json, err := jsoniter.Marshal(&entry.Data) if err != nil { return nil, fmt.Errorf("failed to marshal fields to JSON , %w", err) } return append(json, '\n'), nil } func main() { formatter := &MyJSONFormatter{ JSONPrefix: "jsonprefix-", Otherdata: ":otherdata:", } log.SetFormatter(formatter) log.Info("this is customered formatter") }

3)第三方自定义formatter设置日志格式

FluentdFormatter. Formats entries that can be parsed by Kubernetes and Google Container Engine.

logstash. Logs fields as Logstash Events.

caption-json-formatter. logrus's message json formatter with human-readable caption added.

powerful-logrus-formatter. get fileName, log's line number and the latest function's name when print log; Sava log to files.

等等

设置日志级别

logrus日志一共7级别, 从高到低: panic, fatal, error, warn, info, debug, trace.

log.SetLevel(log.WarnLevel) // 设置输出警告级别

设置日志输出方式

log.SetOutput(os.Stdout) // 输入到 Stdout,默认输出到 Stderr

logfile, _ := os.OpenFile("./logrus.log", os.O_CREATE|os.O_RDWR|os.O_APPEND, 0644)
logrus.SetOutput(logfile) // 输出到文件里

例子:

package main import ( log "github.com/sirupsen/logrus" "os" ) func init() { log.SetFormatter(&log.JSONFormatter{}) // 设置 format json log.SetLevel(log.WarnLevel) // 设置输出警告级别 // Output to stdout instead of the default stderr log.SetOutput(os.Stdout) } func main() { log.WithFields(log.Fields{ "animal": "dog", "size": 10, }).Info("a group of dog emerges from the zoon") log.WithFields(log.Fields{ "omg": true, "number": 12, }).Warn("the group's number increased") log.WithFields(log.Fields{ "omg": true, "number": 100, }).Fatal("th ice breaks") // the logrus.Entry returned from WithFields() contextLogger := log.WithFields(log.Fields{ "common": "this is a common filed", "other": "i also should be logged always", }) // 共同字段输出 contextLogger.Info("I'll be logged with common and other field") contextLogger.Info("Me too") }

运行输出:

{"level":"warning","msg":"the group's number increased","number":12,"omg":true,"time":"2021-11-11T18:00:55+08:00"} {"level":"fatal","msg":"th ice breaks","number":100,"omg":true,"time":"2021-11-11T18:00:55+08:00"}

从输出的结果看出,Info 级别的日志信息都没有输出出来。

屏蔽设置日志级别的代码

func init() { log.SetFormatter(&log.JSONFormatter{}) // 设置 format json // log.SetLevel(log.WarnLevel) // 设置输出警告级别 }

在运行输出:

{"animal":"dog","level":"info","msg":"a group of dog emerges from the zoon","size":10,"time":"2021-11-11T18:26:45+08:00"} {"level":"warning","msg":"the group's number increased","number":12,"omg":true,"time":"2021-11-11T18:26:45+08:00"} {"level":"fatal","msg":"th ice breaks","number":100,"omg":true,"time":"2021-11-11T18:26:45+08:00"} exit status 1

从输出的日志信息来看,并没有输出 contextLogger 的日志info信息,日志信息没有输出,为啥没有输出日志?

把上面的 Fatal 输出日志屏蔽掉:

// log.WithFields(log.Fields{ // "omg": true, // "number": 100, // }).Fatal("th ice breaks")

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzpjdw.html