前言
golang自带的log可以满足小部分场景,而如果我们需要有个比较完善的日志模块,那就可以用一些比较成熟的框架,这里推荐logrus,logrus是针对go语言开发的一款日志框架,在github上star数也比较高,其有丰富的hook,且可以自定义,并且完全兼容golang标准库日志模块。
logrus特性
- logrus拥有六种日志级别,debug、info、warn、error、fatal和panic。
- 可扩展的hook机制,使用者可以通过hook的方式将日志分发到任意地方,如标准输出、本地文件系统、logstash、es等。
- 可选的日志输出格式,内置了JSONFormatter和TextFormatter两种日志格式,还可以手动实现接口Formatter来定义自己的日志格式。
- Field机制,鼓励通过Field机制进行精细化、结构话的日志记录。
logrus使用
简单示例
package main
import (
log "github.com/sirupsen/logrus"
)
func main() {
log.WithFields(log.Fields{
"request": "test",
}).Info("logger-test")
}
这样就可以了,可以看到日志输出如下:
那么接下来的问题是,以这种方式输出的日志可以看到的是比较杂乱无章的,那么怎么可以把日志按照一定的格式输出呢?我们看下简单配置
简单配置
package main
import (
log "github.com/sirupsen/logrus"
"os"
)
func init() {
// 设置日志格式为json格式
log.SetFormatter(&log.JSONFormatter{})
// 设置日志格式为Text格式
//log.SetFormatter(&log.TextFormatter{
// DisableColors: true,
// FullTimestamp: true,
//})
// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
// 日志消息输出可以是任意的io.writer类型
log.SetOutput(os.Stdout)
// 设置日志级别为warn以上
log.SetLevel(log.WarnLevel)
}
//日志实现
func main() {
log.WithFields(log.Fields{
"request": "test",
}).Warn("logger-test")
}
输出对应如下:
Logger实例
logger是一种相对高级的用法, 对于一个大型项目, 往往需要一个全局的logrus实例,即logger对象来记录项目所有的日志。
package main
import (
"github.com/sirupsen/logrus"
"os"
)
// logrus提供了New()函数来创建一个logrus的实例。
// 项目中,可以创建任意数量的logrus实例。
var log = logrus.New()
//日志实现
func main() {
// 为当前logrus实例设置消息的输出,同样地,
// 可以设置logrus实例的输出到任意io.writer
log.Out = os.Stdout
// 为当前logrus实例设置消息输出格式为json格式。
// 同样地,也可以单独为某个logrus实例设置日志级别和hook,这里不详细叙述。
log.Formatter = &logrus.JSONFormatter{}
log.WithFields(logrus.Fields{
"err": "error",
"request": "request",
}).Info("log-test")
}
Fields
logrus不推荐使用冗长的消息来记录运行信息,它推荐使用Fields来进行精细化的、结构化的信息记录。
log.WithFields(log.Fields{
"event": event,
"topic": topic,
"key": key,
}).Fatal("Failed to send event")
WithFields可以规范使用者按照其提倡的方式记录日志。但是WithFields依然是可选的,因为某些场景下,使用者确实只需要记录仪一条简单的消息。
通常,在一个应用中、或者应用的一部分中,都有一些固定的Field。比如在处理用户http请求时,上下文中,所有的日志都会有request_id和user_ip。为了避免每次记录日志都要使用log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}),我们可以创建一个logrus.Entry实例,为这个实例设置默认Fields,在上下文中使用这个logrus.Entry实例记录日志即可。
级别日志记录
Logrus 有七个日志记录级别:Trace、Debug、Info、Warning、Error、Fatal 和 Panic。
log.Trace("Something very low level.")
log.Debug("Useful debugging information.")
log.Info("Something noteworthy happened!")
log.Warn("You should probably take a look at this.")
log.Error("Something failed but I'm not quitting.")
// Calls os.Exit(1) after logging
log.Fatal("Bye.")
// Calls panic() after logging
log.Panic("I'm bailing.")
您可以设置日志记录级别Logger,然后它只会记录具有该严重性或高于它的任何记录;
// Will log anything that is info or above (warn, error, fatal, panic). Default.
log.SetLevel(log.InfoLevel)
本文正在参加技术专题18期-聊聊Go语言框架