您的位置:首页 >Golang logrus 的入门教程
发布于2026-04-21 阅读(0)
扫一扫,手机访问
在Go语言的生态里,说到日志记录,logrus是一个绕不开的名字。这款功能丰富的日志库,以其高度灵活的配置选项而闻名。它原生支持从Trace到Fatal的多种日志级别,允许你在文本和JSON格式之间自由切换,并能将日志输出到控制台、文件,甚至通过钩子(Hooks)发送到远程服务或Slack等平台,实现异步处理。

可以说,logrus在易用性和功能完备性之间取得了很好的平衡,足以应对绝大多数项目的日志管理需求。
第一步很简单,通过go get命令即可获取:
go get github.com/sirupsen/logrus
在代码中引入包后,通常我们会创建一个全局的Logger实例:
import "github.com/sirupsen/logrus" var log = logrus.New()
当然,logrus也贴心地提供了一个开箱即用的全局标准logger,名为std。其底层实现就是一个通过New()函数创建的默认实例。这个函数的设计非常清晰,直接指明了核心配置项:
var (
// std is the name of the standard logger in stdlib `log`
std = New()
)
// Creates a new logger. Configuration should be set by changing `Formatter`,
// `Out` and `Hooks` directly on the default logger instance. You can also just
// instantiate your own:
//
// var log = &logrus.Logger{
// Out: os.Stderr,
// Formatter: new(logrus.TextFormatter),
// Hooks: make(logrus.LevelHooks),
// Level: logrus.DebugLevel,
// }
//
// It's recommended to make this a global instance called `log`.
func New() *Logger {
return &Logger{
Out: os.Stderr,
Formatter: new(TextFormatter),
Hooks: make(LevelHooks),
Level: InfoLevel,
ExitFunc: os.Exit,
ReportCaller: false,
}
}
创建好Logger后,就可以通过一系列方法对其进行定制了。比如,设置日志格式和级别:
log.SetFormatter(&logrus.TextFormatter{})
log.SetLevel(logrus.DebugLevel)
配置妥当,打印日志就变得直观明了:
log.Info("This is an info log.")
log.Warn("This is a warning log.")
log.Error("This is an error log.")
根据不同的场景,可以选用Trace、Debug、Info、Warn、Error和Fatal等不同级别的方法。
默认情况下,日志会输出到标准错误(os.Stderr)。你可以通过修改Out属性,将其重定向到任何实现了io.Writer接口的目标,比如标准输出:
log.Out = os.Stdout
更强大的是钩子(Hooks)机制。通过AddHook方法,你可以为日志添加各种处理器,轻松实现日志的异步发送或自定义处理逻辑:
log.Hooks.Add(hook)
以上便是logrus最核心的使用方法。掌握了这些,你就已经能应对大部分日常开发了。当然,它的高级功能远不止于此。
在实际生产环境中,日志文件不能无限增长。为了节省磁盘空间并便于历史查阅,我们通常需要按时间或大小对日志进行切割、归档,并清理过期的旧文件。这个过程,就是常说的日志滚动(log rotation)。
那么问题来了:logrus自身并未内置滚动功能,我们该如何实现?答案是借助第三方库。其中,lumberjack是一个经典且可靠的选择。
下面这段代码展示了如何将lumberjack与logrus结合,实现日志滚动:
package main
import (
log "github.com/Sirupsen/logrus"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logger := &lumberjack.Logger{
// 日志输出文件路径。
Filename: "/var/log/myapp/foo.log",
// 日志文件最大 size, 单位是 MB。
MaxSize: 100,
// 最大过期日志保留的个数。
MaxBackups: 10,
// 保留过期文件的最大时间间隔,单位天。
MaxAge: 30,
// 是否需要压缩滚动日志, 使用的 gzip 压缩,缺省为 false。
Compress: true,
}
log.SetOutput(logger) // 设置 logrus 的 io.Writer
}
配置参数的含义已在注释中说明。关键在于,lumberjack.Logger实现了io.Writer接口,因此可以直接作为logrus.SetOutput()的入参,无缝衔接。
理论结合实践,这里提供一个更完整的配置示例。我们使用logrus的全局标准logger,并集成滚动日志与多路输出。
import (
"fmt"
"io"
"os"
"github.com/sirupsen/logrus"
lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
// Level 日志级别。建议从服务配置读取。
var LogConf = struct {
Dir string `yaml:"dir"`
Name string `yaml:"name"`
Level string `yaml:"level"`
MaxSize int `yaml:"max_size"`
}{
Dir: "./logs",
Name: "yourlogname.log",
Level: "trace",
MaxSize: 100,
}
// Init logrus logger.
func InitLogger() error {
// 设置日志格式。
logrus.SetFormatter(&logrus.TextFormatter{
TimestampFormat: "2006-01-02 15:04:05.000",
})
switch Level {
case "trace":
logrus.SetLevel(logrus.TraceLevel)
case "debug":
logrus.SetLevel(logrus.DebugLevel)
case "info":
logrus.SetLevel(logrus.InfoLevel)
case "warn":
logrus.SetLevel(logrus.WarnLevel)
case "error":
logrus.SetLevel(logrus.ErrorLevel)
case "fatal":
logrus.SetLevel(logrus.FatalLevel)
case "panic":
logrus.SetLevel(logrus.PanicLevel)
}
logrus.SetReportCaller(true) // 打印文件、行号和主调函数。
// 实现日志滚动。
// Refer to https://www.cnblogs.com/jssyjam/p/11845475.html.
logger := &lumberjack.Logger{
Filename: fmt.Sprintf("%v/%v", LogConf.Dir, LogConf.Name), // 日志输出文件路径。
MaxSize: LogConf.MaxSize, // 日志文件最大 size(MB),缺省 100MB。
MaxBackups: 10, // 最大过期日志保留的个数。
MaxAge: 30, // 保留过期文件的最大时间间隔,单位是天。
LocalTime: true, // 是否使用本地时间来命名备份的日志。
}
// 同时输出到标准输出与文件。
logrus.SetOutput(io.MultiWriter(logger, os.Stdout))
return nil
}
至此,我们已经覆盖了logrus从入门到满足生产需求的核心用法。当然,logrus的潜力不止于此,其丰富的钩子系统和格式化器允许你实现更复杂的定制逻辑,值得深入探索。
最后,放眼Go生态,logrus虽好,但并非唯一选择。了解其他选项有助于做出更适合的技术决策:
Go标准库自带的log包,提供了Print、Fatal、Panic等系列函数,足以满足简单场景下的日志需求,无需引入任何外部依赖。
由Uber开源的高性能日志库。其设计哲学是“零分配”(Zero Allocation),在极致性能方面表现突出。支持多种输出格式和方式,是目前许多对性能有严苛要求的大公司的首选。
另一款以高性能和简洁API著称的日志库。它同样追求低开销和高效率,代码库非常轻量,API设计直观易用。
总而言之,每个日志库都有其独特的优势和适用场景。logrus在功能、灵活性和社区生态上取得了很好的均衡,而zap和zerolog则在性能赛道上领先。根据项目的具体复杂度、性能要求和个人偏好来做出选择,才是关键。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9