跳过正文
  1. 文章/
  2. GoLang/
  3. 常用包/
  4. 第三方包/

10、logrus

·1411 字·3 分钟· loading · loading · ·
GoLang 常用包 第三方包
GradyYoung
作者
GradyYoung
第三方包 - 点击查看当前系列文章
§ 10、logrus 「 当前文章 」

Logrus 是目前 GitHub 上 Star 数量最多的 Go 日志库, 具有如下特点:

  • 与 Go log 标准库 API 完全兼容,这意味着任何使用 log 标准库的代码都可以将日志库无缝切换到 Logrus。
  • 支持七种日志级别:TraceDebugInfoWarnErrorFatalPanic
  • 支持结构化日志记录(key-value 形式,容易被程序解析,如 JSON 格式),通过 Filed 机制进行结构化的日志记录。
  • 支持自定义日志格式,内置两种格式 JSONFormatter(JSON 格式) 和 TextFormatter(文本格式),并允许用户通过实现 Formatter 接口来自定义日志格式。
  • 支持可扩展的 Hooks 机制,可以为不同级别的日志添加 Hooks 将日志记录到不同位置,例如将 ErrorFatalPanic 级别的错误日志发送到 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。所以为了能看到TraceDebug日志,我们在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{})

第三方格式
#

除了内置的TextFormatterJSONFormatter,还有不少第三方格式支持。

就比如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.WithFieldlogrus.WithFields实现。

logrus.WithFields接受一个logrus.Fields类型的参数,其底层实际上为map[string]interface{}

如果在一个函数中的所有日志都需要添加某些字段,可以使用WithFields的返回值。例如在 Web 请求的处理器中,日志都要加上user_idip字段:

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")
}
第三方包 - 点击查看当前系列文章
§ 10、logrus 「 当前文章 」