Logrus 是目前 GitHub 上 Star 数量最多的 Go 日志库, 具有如下特点:
- 与 Go log 标准库 API 完全兼容,这意味着任何使用 log 标准库的代码都可以将日志库无缝切换到 Logrus。
- 支持七种日志级别:
Trace、Debug、Info、Warn、Error、Fatal、Panic。 - 支持结构化日志记录(key-value 形式,容易被程序解析,如 JSON 格式),通过 Filed 机制进行结构化的日志记录。
- 支持自定义日志格式,内置两种格式
JSONFormatter(JSON 格式) 和TextFormatter(文本格式),并允许用户通过实现Formatter接口来自定义日志格式。 - 支持可扩展的 Hooks 机制,可以为不同级别的日志添加 Hooks 将日志记录到不同位置,例如将
Error、Fatal和Panic级别的错误日志发送到 logstash、kafka 等。 - 支持在控制台输出带有不同颜色的日志。
- 并发安全。
安装 #
go get -u github.com/sirupsen/logrus
简单使用 #
package main
import "github.com/sirupsen/logrus"
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")
}
logrus的使用非常简单,与标准库log类似。logrus支持更多的日志级别:
-
Panic:记录日志,然后panic。 -
Fatal:致命错误,出现错误时程序无法正常运转。输出日志后,程序退出; -
Error:错误日志,需要查看原因; -
Warn:警告信息,提醒程序员注意; -
Info:关键操作,核心流程的日志; -
Debug:一般程序中输出的调试信息; -
Trace:很细粒度的信息,一般用不到;
日志级别从上向下依次增加,Trace最大,Panic最小。logrus有一个日志级别,高于这个级别的日志不会输出。默认的级别为InfoLevel。所以为了能看到Trace和Debug日志,我们在main函数第一行设置日志级别为TraceLevel。
配置 #
创建 Logger 对象 #
可以创建自己的Logger对象,使用方式与直接调用logrus的方法类似:
package main
import "github.com/sirupsen/logrus"
func main() {
log := logrus.New()
log.SetLevel(logrus.InfoLevel)
log.SetFormatter(&logrus.JSONFormatter{})
log.Info("info msg")
}
重定向输出 #
默认情况下,日志输出到io.Stderr。可以调用logrus.SetOutput传入一个io.Writer参数。
logrus.SetOutput(os.Stdout)
输出文件名 #
调用logrus.SetReportCaller(true)设置在输出日志中添加文件名和方法信息。
输出多了两个字段file为调用logrus相关方法的文件名,method为方法名。
logrus.SetReportCaller(true)
日志格式 #
logrus支持两种日志格式:文本(TextFormatter)和 JSON(JSONFormatter),默认为文本格式。可以通过logrus.SetFormatter设置日志格式:
logrus.SetFormatter(&logrus.JSONFormatter{})
第三方格式 #
除了内置的TextFormatter和JSONFormatter,还有不少第三方格式支持。
就比如nested-logrus-formatter,首先安装它
go get github.com/antonfisher/nested-logrus-formatter
然后我们配置这个 Formatter 即可
package main
import (
nested "github.com/antonfisher/nested-logrus-formatter"
"github.com/sirupsen/logrus"
"os"
"time"
)
func main() {
logrus.SetOutput(os.Stdout)
logrus.SetReportCaller(true)
logrus.SetFormatter(&nested.Formatter{
HideKeys: true, // 隐藏键
TimestampFormat: time.DateTime, // 时间格式
ShowFullLevel: false, // 显示完整级别名称
NoColors: false, // 不使用颜色
})
logrus.Info("info msg")
logrus.Error("error msg")
}
/*
2025-06-26 10:09:38 [INFO] info msg (/Users/yanggang/develop/go-project/gin-demo/demo.go:20 main.main)
2025-06-26 10:09:38 [ERRO] error msg (/Users/yanggang/develop/go-project/gin-demo/demo.go:21 main.main)
*/
添加字段 #
有时候需要在输出中添加一些字段,可以通过调用logrus.WithField和logrus.WithFields实现。
logrus.WithFields接受一个logrus.Fields类型的参数,其底层实际上为map[string]interface{}。
如果在一个函数中的所有日志都需要添加某些字段,可以使用WithFields的返回值。例如在 Web 请求的处理器中,日志都要加上user_id和ip字段:
package main
import (
"github.com/sirupsen/logrus"
)
func main() {
requestLogger := logrus.WithFields(logrus.Fields{
"user_id": 10010,
"ip": "192.168.32.15",
})
requestLogger.Info("info msg")
requestLogger.Error("error msg")
}