golang,go,博客,开源,编程

golang每日一库之logrus

Published on with 0 views and 0 comments

logrus 是一个功能强大的 Go 语言日志库,它提供了丰富的日志级别、结构化日志、日志钩子(hook)等特性,能够帮助开发者以更可维护、可扩展的方式记录应用程序的日志。与 Go 的标准日志包相比,logrus 提供了更多的功能,尤其是结构化日志,能够输出 JSON 格式的日志,适用于分布式系统和微服务架构。

1. 安装

要使用 logrus,首先需要安装它。你可以通过 go get 来安装:

go get github.com/sirupsen/logrus

2. 基本用法

logrus 提供了类似于 Go 标准库 log 的 API,但它扩展了许多功能,如日志级别、日志格式、钩子等。

2.1 初始化 Logger

首先,导入 logrus 并创建一个 logger 实例:

package main

import (
	"github.com/sirupsen/logrus"
)

func main() {
	// 创建一个默认的 logger
	var log = logrus.New()

	// 使用 logger 打印日志
	log.Info("This is an info log")
	log.Warn("This is a warning log")
	log.Error("This is an error log")
}

在默认情况下,logrus 使用 TextFormatter 格式输出日志。

2.2 日志级别

logrus 支持以下常见的日志级别(优先级由高到低):

  • Debug:调试信息。
  • Info:一般信息。
  • Warn:警告信息。
  • Error:错误信息。
  • Fatal:致命错误,程序将退出。
  • Panic:严重错误,程序将 panic。

你可以设置日志的级别,这样只有优先级高于或等于当前级别的日志才会输出。

log.SetLevel(logrus.WarnLevel) // 设置日志级别为 Warn
log.Debug("This is a debug log") // 不会输出
log.Info("This is an info log")  // 不会输出
log.Warn("This is a warning log") // 会输出
log.Error("This is an error log") // 会输出

2.3 设置日志格式

logrus 支持多种日志输出格式:

  • TextFormatter(默认):人类可读的文本格式。
  • JSONFormatter:结构化日志输出,适用于机器解析。

你可以通过 log.SetFormatter() 来设置日志的格式。

// 设置为 JSON 格式
log.SetFormatter(&logrus.JSONFormatter{})
log.Info("This is an info log")

输出将变成 JSON 格式:

{"level":"info","msg":"This is an info log","time":"2025-02-07T00:00:00+00:00"}

2.4 日志字段(Structured Logging)

logrus 支持结构化日志,可以通过 WithFieldWithFields 方法添加额外的字段(如用户 ID、请求 ID 等)到日志中。

log.WithField("user", "John").Info("User logged in")

输出:

{"level":"info","msg":"User logged in","user":"John","time":"2025-02-07T00:00:00+00:00"}

WithFields 允许你添加多个字段:

log.WithFields(logrus.Fields{
	"user": "John",
	"id":   123,
}).Info("User logged in")

输出:

{"level":"info","msg":"User logged in","id":123,"user":"John","time":"2025-02-07T00:00:00+00:00"}

2.5 Fatal 和 Panic

FatalPanic 的区别在于它们会导致程序退出。

  • Fatal 会记录日志后调用 os.Exit(1) 退出程序。
  • Panic 会记录日志后调用 panic(),使程序进入 panic 状态。
log.Fatal("This is a fatal log") // 程序会退出
log.Panic("This is a panic log") // 程序会 panic

3. 日志钩子(Hooks)

logrus 提供了钩子(hook)功能,允许你在日志输出之前或之后做一些处理。钩子可以用来将日志发送到多个地方(如文件、外部系统等)。

3.1 创建自定义 Hook

自定义 Hook 必须实现 logrus.Hook 接口,接口定义了 Levels()Fire() 方法。

package main

import (
	"fmt"
	"github.com/sirupsen/logrus"
)

type MyHook struct{}

func (hook *MyHook) Levels() []logrus.Level {
	return logrus.AllLevels // 钩子作用于所有日志级别
}

func (hook *MyHook) Fire(entry *logrus.Entry) error {
	// 在每次日志输出时执行的逻辑
	fmt.Println("My custom hook triggered!")
	fmt.Println(entry.Message)
	return nil
}

func main() {
	log := logrus.New()
	log.AddHook(&MyHook{}) // 注册自定义 hook

	log.Info("This is an info log") // 会触发钩子
	log.Error("This is an error log") // 会触发钩子
}

在上面的代码中,每次记录日志时,都会触发 MyHook 中的 Fire() 方法。

3.2 使用钩子发送日志到多个地方

你可以将日志发送到文件、外部服务或者第三方日志收集系统。

package main

import (
	"os"
	"github.com/sirupsen/logrus"
)

func main() {
	log := logrus.New()

	// 将日志写入文件
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatal("Failed to open log file:", err)
	}
	log.SetOutput(file)

	log.Info("This is an info log")
	log.Warn("This is a warning log")
}

3.3 使用第三方日志服务

你可以将日志发送到远程日志收集服务(如 ELK Stack、Graylog、Datadog 等),logrus 的钩子功能可以让你非常方便地集成这些服务。

例如,使用 logrus 钩子将日志发送到 Graylog:

// 假设已经实现了一个 Graylog 钩子
log.AddHook(&GraylogHook{})

4. 日志到多个输出

logrus 可以将日志同时输出到多个地方,比如同时输出到控制台和文件:

package main

import (
	"os"
	"github.com/sirupsen/logrus"
)

func main() {
	log := logrus.New()

	// 创建文件输出
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatal("Failed to open log file:", err)
	}
	// 同时将日志输出到文件和控制台
	log.SetOutput(os.Stdout)
	log.SetOutput(file)

	log.Info("This is an info log")
}

5. 日志轮转

logrus 不提供日志轮转功能,但可以通过 logrus 配合其他库实现日志文件轮转。常用的日志轮转库是 lumberjack

go get github.com/natefinch/lumberjack

示例代码:

package main

import (
	"github.com/natefinch/lumberjack"
	"github.com/sirupsen/logrus"
)

func main() {
	log := logrus.New()

	// 使用 lumberjack 实现日志文件轮转
	log.SetOutput(&lumberjack.Logger{
		Filename:   "app.log",  // 日志文件路径
		MaxSize:    100,        // 单个日志文件的最大大小(MB)
		MaxBackups: 3,          // 最多保留的日志文件数量
		MaxAge:     28,         // 日志文件的最大保存天数
		Compress:   true,       // 是否压缩备份文件
	})

	log.Info("This is an info log")
}

6. 总结

logrus 是 Go 语言中一个非常流行且功能强大的日志库。它具有以下优点:

  • 支持多种日志级别:DebugInfoWarnErrorFatalPanic
  • 支持结构化日志:通过 WithFieldWithFields 添加额外的上下文信息。
  • 支持日志格式化:可以选择文本格式或 JSON 格式输出。
  • 支持钩子机制:可以自定义日志处理行为(如将日志发送到外部服务、数据库等)。
  • 支持日志输出到多个地方:可以同时输出到控制台、文件、远程服务等。

通过 `logrus`,你可以更加灵活地记录和管理应用程序的日志,帮助你更好地调试和监控应用程序。


标题:golang每日一库之logrus
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/02/10/1739164716980.html
联系:scotttu@163.com