Golang日志库logrus的介绍与使用

logrus概述

简介

  • Logrus 是一个流行的 Go 语言日志库,它提供了结构化日志和多种日志级别的功能。Logrus 非常灵活,支持自定义日志格式和输出,被许多 Go 语言项目广泛使用

特点

  1. 完全兼容log标准库:Logrus 可以很容易地替换掉log标准库,因为它实现了相同的接口

  2. 结构化日志记录:可以很容易地记录字段数据,这些数据随后可以被其他日志处理系统解析

  3. 多个日志级别:Logrus 支持多种日志级别,包括:PanicFatalErrorWarnInfoDebugTrace

  4. 易于集成:Logrus 可以与其他系统如syslog、Hook等集成,便于日志的集中管理和分析

  5. 高度可定制:可以通过 Hooks 和格式化器来自定义日志的输出格式和内容

下载

go get github.com/sirupsen/logrus

logrus常用方法

logrus.Debugln("Debugln")
logrus.Infoln("Infoln")
logrus.Warnln("Warnln")
logrus.Errorln("Errorln")
logrus.Println("Println")// 输出如下
time="2024-10-20T16:08:01+08:00" level=info msg=Infoln   
time="2024-10-20T16:08:01+08:00" level=warning msg=Warnln
time="2024-10-20T16:08:01+08:00" level=error msg=Errorln 
time="2024-10-20T16:08:01+08:00" level=info msg=Println
  • debug的没有输出,是因为logrus默认的日志输出等级是 info

日志级别

  • logrus.PanicLevel: 记录日志,然后调用 panic()
  • logrus.FatalLevel: 记录日志,然后调用 os.Exit(1)
  • logrus.ErrorLevel: 记录错误级别的日志
  • logrus.WarnLevel: 记录警告级别的日志
  • logrus.InfoLevel: 记录信息级别的日志
  • logrus.DebugLevel: 记录调试级别的日志
  • logrus.TraceLevel: 记录跟踪级别的日志
package mainimport ("os""github.com/sirupsen/logrus"
)func main() {// 设置日志输出到 os.Stdoutlogrus.SetOutput(os.Stdout)// 设置日志级别为 InfoLevel,这意味着 InfoLevel 及以上级别的日志会被记录logrus.SetLevel(logrus.InfoLevel)// 记录不同级别的日志logrus.Trace("This is a trace message and will not be printed.")logrus.Debug("This is a debug message and will not be printed.")logrus.Info("This is an info message and will be printed.")logrus.Warn("This is a warning message and will be printed.")logrus.Error("This is an error message and will be printed.")// 注意:通常不推荐在生产环境中使用 PanicLevel 和 FatalLevel,因为它们会导致程序退出。// logrus.Panic("This is a panic message and will cause the program to panic.")// logrus.Fatal("This is a fatal message and will cause the program to exit.")
}

字段

  • WithField(key string, value interface{}) *Entry:添加一个字段到日志条目
  • WithFields(fields log.Fields) *Entry:添加多个字段到日志条目
  • WithError(err error) *Entry:添加错误字段到日志条目
package mainimport ("os""github.com/sirupsen/logrus"
)func main() {// 设置日志输出到 os.Stdoutlogrus.SetOutput(os.Stdout)// 设置日志格式为 JSON,这对于结构化日志记录很有用logrus.SetFormatter(&logrus.JSONFormatter{})// 使用 WithField 方法添加一个字段logEntry := logrus.WithField("user", "Alice")// 使用 WithFields 方法添加多个字段logEntry = logEntry.WithFields(logrus.Fields{"operation": "login","result":    "success",})// 记录一条包含字段的日志logEntry.Info("User logged in successfully")// 使用 WithError 方法添加一个错误字段err := fmt.Errorf("something went wrong")logEntry.WithError(err).Error("An error occurred")
}

输出

日志样式

显示行号

logrus.SetReportCaller(true)

样式设置

  • 默认的是以text的形式展示,也可以设置为jsong样式
textLogger := logrus.New()// 创建一个 TEXT 格式的日志记录器textLogger.SetFormatter(&logrus.TextFormatter{DisableColors: false,FullTimestamp: true,})// 创建一个 JSON 格式的日志记录器jsonLogger := logrus.New()jsonLogger.SetFormatter(&logrus.JSONFormatter{})

输出地址

  • SetOutput(io.Writer):设置日志的输出目的地

  • SetFormatter(formatter Formatter):设置日志的格式化器

package mainimport ("os""github.com/sirupsen/logrus"
)func main() {// 创建一个新的 Logrus 实例log := logrus.New()// 输出到 os.Stdoutlog.SetOutput(os.Stdout)// 输出到文件file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err == nil {log.SetOutput(file)} else {log.Fatalf("Failed to log to file, using default stderr: %v", err)}// 输出到自定义 io.Writer,例如 bytes.Buffervar buffer bytes.Bufferlog.SetOutput(&buffer)// 记录一些日志log.Info("This is an info message")log.Warn("This is a warning message")log.Error("This is an error message")// 如果输出到 bytes.Buffer,你可以获取日志内容logBytes := buffer.Bytes()os.Stdout.Write(logBytes) // 将 buffer 中的内容输出到 os.Stdout
}

日志颜色

默认颜色

  • DebugLevel: 蓝色

  • InfoLevel: 绿色

  • WarningLevel: 黄色

  • ErrorLevel: 红色

  • FatalLevel: 红色(通常伴随有其他指示,比如退出程序)

  • PanicLevel: 红色(通常伴随有 panic)

禁用颜色

log.SetFormatter(&logrus.TextFormatter{DisableColors: true,
})

自定义颜色

  1. 创建一个新的 TextFormatter 结构体
  2. 重写 Format 方法,在格式化日志时添加自定义颜色代码
  3. 将自定义的 Formatter 设置给 Logrus 实例
package main
import ("bytes""fmt""github.com/sirupsen/logrus""os"
)
// CustomFormatter 自定义格式化器
type CustomFormatter struct {logrus.TextFormatter
}
// Format 实现 logrus.Formatter 接口
func (f *CustomFormatter) Format(entry *logrus.Entry) ([]byte, error) {var b *bytes.Bufferif entry.Buffer != nil {b = entry.Buffer} else {b = &bytes.Buffer{}}// 添加自定义颜色代码color := ""switch entry.Level {case logrus.DebugLevel:color = "\x1b[34m" // 蓝色case logrus.InfoLevel:color = "\x1b[32m" // 绿色case logrus.WarnLevel:color = "\x1b[33m" // 黄色case logrus.ErrorLevel, logrus.FatalLevel, logrus.PanicLevel:color = "\x1b[31m" // 红色}// 写入颜色代码和日志内容fmt.Fprintf(b, "%s%s\x1b[0m\n", color, entry.Message)return b.Bytes(), nil
}
func main() {log := logrus.New()log.SetFormatter(&CustomFormatter{TextFormatter: logrus.TextFormatter{DisableColors: false,FullTimestamp: true,},})log.Debug("This is a debug message")log.Info("This is an info message")log.Warn("This is a warning message")log.Error("This is an error message")
}

自定义格式

  • 通过实现 logrus.Formatter 接口来自定义日志格式
package main
import ("bytes""fmt""time""github.com/sirupsen/logrus"
)
// MyFormatter 自定义格式化器
type MyFormatter struct {
}
// Format 实现了 logrus.Formatter 接口
func (f *MyFormatter) Format(entry *logrus.Entry) ([]byte, error) {b := &bytes.Buffer{}// 自定义时间格式timestamp := time.Now().Format(time.RFC3339)fmt.Fprintf(b, "[%s] ", timestamp)// 自定义日志级别level := entry.Level.String()fmt.Fprintf(b, "[%s] ", level)// 自定义消息格式message := entry.Messagefmt.Fprintf(b, "%s ", message)// 添加字段for key, value := range entry.Data {fmt.Fprintf(b, "%s=%v ", key, value)}// 添加换行符b.WriteByte('\n')return b.Bytes(), nil
}
func main() {log := logrus.New()// 设置自定义格式化器log.SetFormatter(&MyFormatter{})log.WithFields(logrus.Fields{"animal": "walrus","size":   10,}).Info("A group of walrus emerges from the ocean")
}
  • MyFormatter 结构体实现了 Format 方法,该方法接收一个 logrus.Entry 对象,该对象包含了日志条目的所有信息,包括时间戳、日志级别、消息和字段。Format 方法将这些信息格式化为一个字符串,并返回字节数组。
[2024-10-20T17:14:22+08:00] [info] A group of walrus emerges from the ocean size=10 animal=walrus 

Hook

  • 在 Logrus 中,Hook 是一个接口,允许你添加自定义的逻辑,这些逻辑会在日志记录之前或之后执行。通过实现 logrus.Hook 接口,你可以创建自己的钩子来执行额外的操作,比如发送日志到远程系统、写入数据库、执行特定的监控检查等。

  • 在 Logrus 中,Hook 的基本用法涉及以下步骤:

  1. 定义一个 Hook 结构体:这个结构体需要实现 Levels()Fire(entry *logrus.Entry) error 方法。
  2. 实现 Levels() 方法:这个方法返回一个 logrus.Level 切片,表示该 Hook 将被哪些日志级别触发。
  3. 实现 Fire(entry \*logrus.Entry) error 方法:这个方法定义了当日志被记录时应该执行的逻辑。
  4. 将 Hook 添加到 Logrus 实例:使用 log.AddHook(hook) 方法。
  • 自定义 Hook 示例,它会在每次记录日志时打印出当前的函数名和文件名:
package main
import ("fmt""runtime""github.com/sirupsen/logrus"
)
// MyHook 是一个自定义的 Logrus 钩子
type MyHook struct {
}
// Levels 定义了这个钩子会被哪些日志级别触发
func (hook *MyHook) Levels() []logrus.Level {return logrus.AllLevels
}
// Fire 是每次日志记录时都会调用的方法
func (hook *MyHook) Fire(entry *logrus.Entry) error {// 获取调用者的函数名和文件名pc, file, line, ok := runtime.Caller(8) // 8 是调用栈的深度,可能需要根据你的代码结构进行调整if !ok {fmt.Println("Could not get caller info")return nil}function := runtime.FuncForPC(pc).Name()fmt.Printf("Caller: %s:%d %s\n", file, line, function)return nil
}
func main() {log := logrus.New()// 添加自定义钩子log.AddHook(&MyHook{})log.Info("This is an informational message")log.Warn("This is a warning message")
}
  • 在上面的代码中,MyHook 结构体实现了 LevelsFire 方法。Levels 方法返回一个日志级别切片,表示这个钩子会对哪些级别的日志进行响应。在这个例子中,我们使用 logrus.AllLevels,这意味着它会对所有级别的日志做出响应。
    Fire 方法会在每次记录日志时被调用。在这个方法中,我们使用 runtime.Caller 来获取调用日志记录函数的函数名和文件名,并打印出来。
    main 函数中,我们创建了一个 Logrus 实例,并使用 AddHook 方法将自定义的 MyHook 添加到 Logrus 中。之后,当我们记录日志时,MyHookFire 方法会被调用,并打印出调用日志的函数名和文件名。

  • 代码输出:

Caller: D:/goproject/pkg/mod/golang.org/toolchain@v0.0.1-go1.23.2.windows-amd64/src/runtime/proc.go:272 runtime.main
time="2024-10-20T17:19:37+08:00" level=info msg="This is an informational message"
time="2024-10-20T17:19:37+08:00" level=warning msg="This is a warning message"
Caller: D:/goproject/pkg/mod/golang.org/toolchain@v0.0.1-go1.23.2.windows-amd64/src/runtime/proc.go:272 runtime.main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣2653.滑动窗口的美丽值

给你一个长度为 n 的整数数组 nums ,请你求出每个长度为 k 的子数组的 美丽值 。 一个子数组的 美丽值 定义为:如果子数组中第 x 小整数 是 负数 ,那么美丽值为第 x 小的数,否则美丽值为 0 。 请你返回一个包含 n - k 1 个整数…

挖掘数据金矿:Python中缺失值处理的艺术与技巧

引言 在实际的数据集处理过程中,我们经常会遇到各种各样的缺失值问题。这些问题可能是由于数据收集过程中的疏忽,或是数据传输中的丢失造成的。无论是哪种情况,缺失值都会直接影响模型的训练效果和预测准确性。因此,掌握有效的缺…

Java项目-基于springcloud框架的分布式架构网上商城系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

​​【项目建设PPT模板】中台建设,中台设计,数字中台整体建设方案(PPT)

工业互联网数字中台解决方案旨在为企业提供全面、高效的数据驱动能力。该方案主要包括以下几个核心部分: 数据中台:作为核心,数据中台负责汇聚、整合、提纯和加工各类工业数据,实现数据资产的标准化、模型化和模块化。通过提供API…

对Kotlin在Android开发中的应用看法

Kotlin在Android开发中的应用:深度解析与前景展望 自Google于2017年宣布Kotlin成为Android开发的官方语言以来,Kotlin在Android开发者社区中迅速崛起,成为与Java并肩而行的主流编程语言。这一变化不仅反映了技术发展的趋势,也体现…

【Pycharm】显示内存不足the IDE is running low on memory解决方法

Pycharm提示显示内存不足the IDE is running low on memory解决方法 在右上角找到Help,点击,找到change memory settings 修改数值如1024,2048 等,增大容量即可。最后点击save and Restart

C++学习,标准库 <regex>

C11 引入了 <regex> 标准库&#xff0c;用于处理正则表达式。这个库提供了一系列类和函数&#xff0c;使得在 C 中进行复杂的字符串匹配、搜索和替换操作变得更加方便和高效。正则表达式是一种强大的文本处理工具&#xff0c;广泛应用于数据验证、文本分析和模式匹配等领…

【Unity】什么是定点数?定点数的实现原理(个人复习笔记/侵删/不足之处欢迎斧正)

什么是定点数&#xff1f;定点数的实现原理 什么是定点数&#xff1f; 约定计算机中小数点的位置&#xff0c;且这个位置固定不变&#xff0c;小数点前、后的数字&#xff0c;分别用二进制表示&#xff0c;然后组合起来就可以把这个数字在计算机中存储起来&#xff0c;这种表…

红日安全vulnstack (一)

目录 环境搭建 本机双网卡 Kali IP 靶机IP Web GetShell 前期信息收集 Yxcms后台模板 Getshell PHPMyAdmin日志 Getshell into outfile写入一句话 X phpmyadmin 日志写入一句话 后渗透 MSF 生成木马上线 提取用户hash值 **hash**加密方式 MSF权限Shell至CS CS …

如何使用FastAPI开发Serverless应用?

使用FastAPI开发Serverless应用是一种现代且高效的方法&#xff0c;它结合了FastAPI的高性能和Serverless架构的灵活性、可扩展性以及低成本。下面是一个基本指南&#xff0c;帮助你从零开始创建并部署一个FastAPI应用到Serverless环境。 1. 安装FastAPI和Uvicorn 首首先&…

基于springboot美食推荐商城的设计与实现

基于springboot美食推荐商城的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;https:…

CSS进阶-定位(二)

8、定位 定位元素的层级比普通元素高&#xff0c;定位元素之间的层级相等&#xff0c;若发生覆盖&#xff0c;则后写的元素覆盖在先写的元素上面。 属性名描述position:relative;相对定位&#xff08;相对默认位置进行定位&#xff0c;不脱离文档流&#xff0c;仍占据页面位置&…

91. 一段曲线颜色渐变

可以通过几何体顶点颜色.attributes.color数据&#xff0c;实现一段曲线颜色渐变效果。 样条曲线几何体 首先提供一个样条曲线生成的几何体。 const geometry new THREE.BufferGeometry(); //创建一个几何体对象 // 三维样条曲线 const curve new THREE.CatmullRomCurve3(…

【Next.js 项目实战系列】04-修改 Issue

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】03-查看 Issue 修改 Issue 添加修改 Button​ 本节代码链接 安装 Radix UI 的 Ra…

YOLO11 目标检测 | 导出ONNX模型 | ONNX模型推理

本文分享YOLO11中&#xff0c;从xxx.pt权重文件转为.onnx文件&#xff0c;然后使用.onnx文件&#xff0c;进行目标检测任务的模型推理。 用ONNX模型推理&#xff0c;便于算法到开发板或芯片的部署。 备注&#xff1a;本文是使用Python&#xff0c;编写ONNX模型推理代码的 目…

【Vercel】Vercel静态部署踩坑

背景 在现代的软件开发中&#xff0c;自动化部署是一个不可或缺的环节。Vercel作为一个流行的前端部署平台&#xff0c;提供了与GitHub的无缝集成&#xff0c;使得开发者能够在每次提交代码后自动触发部署流程。然而&#xff0c;自动化部署过程中可能会遇到一些挑战&#xff0…

全网免费的文献调研方法以及获取外网最新论文、代码和翻译pdf论文的方法(适用于硕士、博士、科研)

1. 文献调研 学术搜索引擎(十分推荐前三个&#xff0c;超有用)&#xff1a;使用 Google Scholar(https://scholar.google.com/)(https://scholar.google.com.tw/)(巨人学术搜索‬‬)、&#xff08;三个都可以&#xff0c;镜像网站&#xff09; arXiv(https://arxiv.org/)、&am…

qt页面设计

1. Designer 设计师&#xff08;掌握&#xff09; Designer是Qt内置的一款界面设计程序&#xff0c;设计的界面文件为.ui格式。 C程序员通常不会单独启动Designer&#xff0c;如果要在项目中使用Designer程序&#xff0c;只需要在新建项目时&#xff0c;勾选“创建界面文件”选…

学习C语言(25)

整理今天的学习内容 预处理详解 1.预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号是在预处理期间处理的 __FILE__&#xff08;进行编译的源文件&#xff09; __LINE__ &#xff08;文件当前的行号&#xff09; __DATE__&#xff08…

Visual Studio 2022安OpenCV可视化工具image watch

1. 打开 VS2022 &#xff0c;扩展 -管理扩展 2. 搜索 Image Watch 关闭VS2022 后 安装 打开视图、调出 Image Watch 窗口 测试代码&#xff1a; #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.…