首页 > 其他分享 >logrus使用方法

logrus使用方法

时间:2025-01-22 16:12:46浏览次数:1  
标签:info 10 示例 logrus 使用 message 方法 日志

目录


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 等工具使用。

标签:info,10,示例,logrus,使用,message,方法,日志
From: https://www.cnblogs.com/yubo-guan/p/18686285

相关文章

  • Jetpack架构组件学习(6)——使用Glance实现桌面小组件
    原文地址:Jetpack架构组件学习(6)——使用Glance实现桌面小组件-Stars-One的杂货小窝公司陆续整了几个Compose写的app,有个小组件的功能,顺便试了下Jetpack库里的Glance框架感觉与原来的Remoteview差点意思,不过点击事件的使用比Remoteview要方便不少PS:如果想看Remotevie......
  • 【SAP Abap】X档案:SAP ABAP 中 AMDP 简介及实现方法(转)
    SAPABAP中AMDP简介及实现方法0、前言1、AMDP简介1.1代码下沉(CodePushdown)1.2AMDP是托管数据库过程的容器1.3AMDP的优缺点1.4几种数据库访问方式的区别1.5几种数据库访问方式的选用1.6使用的开发工具2、实现方法2.1AMDPPROCEDURE(存储过程)实现2.2AMDPFUNCTION(函数......
  • 查看 C# 版本的方法
    在C#开发中,了解当前使用的C#版本非常重要,因为不同版本的C#支持不同的语言特性。以下是几种查看C#版本的方法:1.通过VisualStudio查看如果你使用的是VisualStudio,可以通过以下步骤查看当前项目的C#版本:方法1:项目属性在解决方案资源管理器中,右键单击项目名......
  • Npcap的安装与使用
    学习计算机网络,使用WinArpAttacker理解arp的机制。文章目录1.WinPcap2.Npcap3.使用VSCode安装NpcapSDK问题1:没有链接器选项。1.WinPcap网站:https://www.winpcap.org/WinPcapHasCeasedDevelopment.WerecommendNpcap.TheWinPcapprojecthas......
  • .net core 的 swagger 分组简单使用
    1.Programm中添加builder.Services.AddSwaggerGen(c=>{c.SwaggerDoc("v1",newOpenApiInfo{Title="BarcodeAPI",Version="v1"});c.SwaggerDoc("WMS",newOpenApiInfo{Title="W......
  • 时间序列平稳性的双重假设检验:KPSS与ADF方法比较研究
    在进行时间序列分析之前,确定序列的平稳性是一个关键步骤。平稳性指的是时间序列的统计特性(如均值和方差)在时间维度上保持不变。本文将详细介绍如何运用 KPSS检验和 Dickey-Fuller检验来验证序列的平稳性。这两种检验方法基于不同的统计假设:KPSS检验的原假设是数据非平稳,而Di......
  • 研发效率低下?试试这些改进方法
    最近这段时间,互联网上发生了很多大事:极越汽车突然宣布破产解散;养乐多上海工厂关闭;网传海信大规模裁员;……2024年即将结束,如果给2024年打个标签,有人说是“愈加魔幻”的一年,有人说是“挑战激增”的一年,也有人说是“生存指数飙升”的一年。根据裁员追踪机构layoffs.f......
  • 使用 husky pre-commit 脚本自动检测提交代码里的关键词
    需求场景:1.若本地环境某个接口实在无法返回类真实的数据(包括一直是null或者一直是0),前端得做mock数据,提交的时候得注释掉mock相关代码。2. 我在上一家公司,由于要调试tiptap,大家都写了很多console.log,组长要求大家提pr的时候注释掉console.log以免影响他人调试......
  • 【翻译】使用Jackson反序列化接口
    作者:AndrewTarry原文链接:DeserializinganinterfacewithJackson原文发表时间:2020-05-2715:10 +0100原文更新时间:2023-01-3111:22+0200在将Json和Java对象互相转换的库中,我最喜欢的是Jackson。它可以自动把对象映射到POJO。但反序列化接口需要多写些代码。Jackson能从POJO......
  • 我把一个Rust程序函数标记为async之后,当它被执行时返回一个Future对象,是这样吧? 那我持
    UUUUUUUUUU是的,您理解是正确的。让我们详细解答您的问题。1.async函数的行为当你将一个Rust函数标记为async时,函数不会立即返回结果,而是返回一个Future对象。这个Future表示计算的结果,并且会在某个时刻完成(即变为Ready状态,包含计算结果)。例如:asyncfnexample()......