• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Golang 日志库 logrus 极快上手

武飞扬头像
恋喵大鲤鱼
帮助1

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 - 博客园

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfiaja
系列文章
更多 icon
同类精品
更多 icon
继续加载