logrus 是一款流行的 Golang 日志库,具有非常灵活的配置选项。它支持多种日志级别、日志格式和输出方式,包括文本格式和 JSON 格式的输出,以及在控制台输出、文件输出、发送到远程服务、发送到 Slack 等。logrus 也可以通过 Hooks 实现日志的异步输出和处理。
总的来说,logrus 使用方便,功能齐全,适合大部分项目的日志记录需求。
使用 go get 命令安装 logrus:
go get github.com/sirupsen/logrus
在程序中引入 logrus 包,并创建一个 Logger 对象:
import "github.com/sirupsen/logrus"
var log = logrus.New()
当然,你也可以使用全局缺省的 Logger 对象 std。其定义如下:
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 对象的方法来配置 Logger,例如设置日志输出格式、设置日志级别等等。以下是一个例子:
log.SetFormatter(&logrus.TextFormatter{})
log.SetLevel(logrus.DebugLevel)
可以使用 Logger 对象的方法来打印日志,例如:
log.Info("This is an info log.")
log.Warn("This is a warning log.")
log.Error("This is an error log.")
可以通过不同的方法来打印不同级别的日志,例如Debug、Info、Warn、Error等等。
Logger 对象默认将日志输出到 os.Stderr,可以通过 Logger 对象的 Out 属性来指定输出到其他的 io.Writer,例如:
log.Out = os.Stdout
可以通过Logger对象的Hook属性来添加Hook,实现异步输出和处理日志的需求,例如:
log.Hooks.Add(hook)
这些就是logrus的基本使用方法,可以根据具体需求来使用logrus的其他高级功能。
在实际开发过程中,为了节省磁盘和方便查看,日志需要按照时间或者大小维度进行切割分成多分归档过期的日志,删除久远的日志.这个就是在日常开发中经常遇见的日志滚动(log rotation)。
那么在 logrus 中我们该如何实现这个功能呢? logrus 本身并没有实现滚动日志功能,但是我们可以使用第三方滚动插件实现。
我们可以使用 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
}
滚动日志的各项参数如注释所示,logrus 的 setOutput() 函数的入参是 io.Writer 类型,lumberjack.Logger 实现了该接口。
这里使用 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,Golang 还有很多好用的日志库,以下是几个比较流行的:
Golang 自带了一个 log 包,可以满足基本的日志需求。这个包有几个函数:Print、Printf、Println、Fatal、Fatalf、Fatalln、Panic、Panicf、Panicln,可以满足大部分日志的打印和处理需求。
zap 是 Uber 开源的一款高性能日志库,它支持多种日志级别和输出方式,包括console、json、file等等。zap的性能比较优秀,它使用了Zero Allocation的设计理念,在不影响性能的情况下尽量避免内存分配。
zerolog 是一款轻量级的日志库,具有非常好的性能和可扩展性。它支持多种日志级别、输出格式和输出方式,包括 console、json、file 等等。zerolog 的设计理念是简单、易用、高性能,代码量也比较少。
总的来说,以上几个日志库都具有不同的优点和适用场景,可以根据具体需求选择使用。
OpenAI ChatGPT
github.com/sirupsen/logrus
logrus 剖析之滚动日志- jssyjam - 博客园