logrus使用方法


logrus 是 Go 语言中一个非常流行的结构化日志库,提供了丰富的日志功能,包括日志级别、字段绑定、钩子(Hooks)等。以下是 logrus 的基本使用方法。


1. 安装 logrus

首先,使用以下命令安装 logrus

go get github.com/sirupsen/logrus

2. 基本用法

以下是一个简单的 logrus 使用示例:

package main

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

func main() {
	// 设置日志格式为 JSON
	logrus.SetFormatter(&logrus.JSONFormatter{})

	// 设置日志级别
	logrus.SetLevel(logrus.InfoLevel)

	// 记录日志
	logrus.Info("This is an info message")
	logrus.Warn("This is a warning message")
	logrus.Error("This is an error message")
}

输出示例

{"level":"info","msg":"This is an info message","time":"2023-10-05T14:30:45Z"}
{"level":"warning","msg":"This is a warning message","time":"2023-10-05T14:30:45Z"}
{"level":"error","msg":"This is an error message","time":"2023-10-05T14:30:45Z"}

3. 日志级别

logrus 支持以下日志级别:

  • logrus.TraceLevel
  • logrus.DebugLevel
  • logrus.InfoLevel
  • logrus.WarnLevel
  • logrus.ErrorLevel
  • logrus.FatalLevel
  • logrus.PanicLevel

设置日志级别

logrus.SetLevel(logrus.DebugLevel)

记录不同级别的日志

logrus.Trace("This is a trace message")
logrus.Debug("This is a debug message")
logrus.Info("This is an info message")
logrus.Warn("This is a warning message")
logrus.Error("This is an error message")
logrus.Fatal("This is a fatal message") // 记录日志后调用 os.Exit(1)
logrus.Panic("This is a panic message") // 记录日志后调用 panic()

4. 添加字段

logrus 支持在日志中添加结构化字段,方便后续分析和过滤。

logrus.WithFields(logrus.Fields{
	"user_id": 123,
	"event":   "login",
}).Info("User logged in")

输出示例

{"event":"login","level":"info","msg":"User logged in","time":"2023-10-05T14:30:45Z","user_id":123}

5. 自定义日志格式

logrus 支持自定义日志格式。以下是使用 TextFormatter 的示例:

logrus.SetFormatter(&logrus.TextFormatter{
	FullTimestamp: true,
	ForceColors:   true,
})

输出示例

INFO[2023-10-05T14:30:45Z] This is an info message
WARN[2023-10-05T14:30:45Z] This is a warning message
ERROR[2023-10-05T14:30:45Z] This is an error message

6. 使用钩子(Hooks)

钩子可以用于将日志发送到其他系统(如 Elasticsearch、Slack 等)。以下是一个简单的钩子示例:

type MyHook struct{}

func (h *MyHook) Levels() []logrus.Level {
	return logrus.AllLevels
}

func (h *MyHook) Fire(entry *logrus.Entry) error {
	// 在这里处理日志,例如发送到远程服务器
	fmt.Println("Hook fired:", entry.Message)
	return nil
}

func main() {
	logrus.AddHook(&MyHook{})
	logrus.Info("This is an info message")
}

输出示例

Hook fired: This is an info message
{"level":"info","msg":"This is an info message","time":"2023-10-05T14:30:45Z"}

7. 日志输出到文件

可以将日志输出到文件,而不是标准输出。

package main

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

func main() {
	// 创建日志文件
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		logrus.Fatal("Failed to open log file:", err)
	}
	defer file.Close()

	// 设置日志输出到文件
	logrus.SetOutput(file)

	// 记录日志
	logrus.Info("This is an info message")
}

8. 使用日志实例

可以创建多个日志实例,用于不同的模块或功能。

package main

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

var (
	appLog  = logrus.New()
	authLog = logrus.New()
)

func main() {
	// 配置 appLog
	appLog.SetFormatter(&logrus.JSONFormatter{})
	appLog.SetLevel(logrus.InfoLevel)

	// 配置 authLog
	authLog.SetFormatter(&logrus.TextFormatter{})
	authLog.SetLevel(logrus.DebugLevel)

	// 使用日志实例
	appLog.Info("Application started")
	authLog.Debug("User authentication successful")
}

9. 日志轮转

可以使用 lumberjack 实现日志轮转(按大小或时间切割日志文件)。

安装 lumberjack

go get gopkg.in/natefinch/lumberjack.v2

使用 lumberjack

package main

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

func main() {
	// 配置日志轮转
	logger := &lumberjack.Logger{
		Filename:   "app.log",
		MaxSize:    10, // 日志文件最大大小(MB)
		MaxBackups: 3,  // 保留的旧日志文件数量
		MaxAge:     28, // 保留的旧日志文件天数
		Compress:   true, // 是否压缩旧日志文件
	}

	// 设置日志输出到 lumberjack
	logrus.SetOutput(logger)

	// 记录日志
	logrus.Info("This is an info message")
}

10. 性能优化

默认情况下,logrus 的字段是动态分配的,可能会影响性能。可以通过以下方式优化:

  • 使用 logrus.Entry 重用字段。
  • 避免在高频日志中添加过多字段。

总结

logrus 是一个功能强大且灵活的日志库,适用于大多数 Go 项目。通过合理配置日志级别、格式、字段和钩子,可以满足复杂的日志需求。如果需要更高级的功能(如日志轮转),可以结合 lumberjack 等工具使用。

posted @   guanyubo  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2024-01-22 线程池
点击右上角即可分享
微信分享提示