当前位置: 首页 > 工具软件 > Logrus > 使用案例 >

Golang logrus 快速上手

邹驰
2023-12-01

1.logrus 是什么?

logrus 是一款流行的 Golang 日志库,具有非常灵活的配置选项。它支持多种日志级别、日志格式和输出方式,包括文本格式和 JSON 格式的输出,以及在控制台输出、文件输出、发送到远程服务、发送到 Slack 等。logrus 也可以通过 Hooks 实现日志的异步输出和处理。

总的来说,logrus 使用方便,功能齐全,适合大部分项目的日志记录需求。

2.logrus 快速上手

1.安装 logrus

使用 go get 命令安装 logrus:

go get github.com/sirupsen/logrus

2.创建 Logger 对象

在程序中引入 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,
	}
}

3.配置 Logger 对象

可以通过 Logger 对象的方法来配置 Logger,例如设置日志输出格式、设置日志级别等等。以下是一个例子:

log.SetFormatter(&logrus.TextFormatter{})
log.SetLevel(logrus.DebugLevel)

4.打印日志

可以使用 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等等。

5.输出日志

Logger 对象默认将日志输出到 os.Stderr,可以通过 Logger 对象的 Out 属性来指定输出到其他的 io.Writer,例如:

log.Out = os.Stdout

可以通过Logger对象的Hook属性来添加Hook,实现异步输出和处理日志的需求,例如:

log.Hooks.Add(hook)

这些就是logrus的基本使用方法,可以根据具体需求来使用logrus的其他高级功能。

3.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 实现了该接口。

4.一个完整的示例

这里使用 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
}

5.小结

logrus 还有很多高级的用法,如有需要,可以深入研究。

此外,除了 logrus,Golang 还有很多好用的日志库,以下是几个比较流行的:

  • log

Golang 自带了一个 log 包,可以满足基本的日志需求。这个包有几个函数:Print、Printf、Println、Fatal、Fatalf、Fatalln、Panic、Panicf、Panicln,可以满足大部分日志的打印和处理需求。

  • zap

zap 是 Uber 开源的一款高性能日志库,它支持多种日志级别和输出方式,包括console、json、file等等。zap的性能比较优秀,它使用了Zero Allocation的设计理念,在不影响性能的情况下尽量避免内存分配。

  • zerolog

zerolog 是一款轻量级的日志库,具有非常好的性能和可扩展性。它支持多种日志级别、输出格式和输出方式,包括 console、json、file 等等。zerolog 的设计理念是简单、易用、高性能,代码量也比较少。

总的来说,以上几个日志库都具有不同的优点和适用场景,可以根据具体需求选择使用。


参考文献

OpenAI ChatGPT
github.com/sirupsen/logrus
logrus 剖析之滚动日志- jssyjam - 博客园

 类似资料: