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 个整数…

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

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

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

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

【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

红日安全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应用是一种现代且高效的方法,它结合了FastAPI的高性能和Serverless架构的灵活性、可扩展性以及低成本。下面是一个基本指南,帮助你从零开始创建并部署一个FastAPI应用到Serverless环境。 1. 安装FastAPI和Uvicorn 首首先&…

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

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

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

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

【Vercel】Vercel静态部署踩坑

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

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

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

qt页面设计

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

学习C语言(25)

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

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

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

分布式系统中的Dapper与Twitter Zipkin:链路追踪技术的实现与应用

目录 一、什么是链路追踪? 二、核心思想Dapper (一)Dapper链路追踪基本概念概要 (二)Trace、Span、Annotations Trace Span Annotation 案例说明 (三)带内数据与带外数据 带外数据 带…

【Linux】进程间通信---匿名管道、命名管道(超详解)

目录 匿名管道 管道的创建: 创建子进程: 关闭不需要的fd: 发送消息: 管道的5种特征: 管道的4种情况: 命名管道 创建命名管道: 删除命名管道: 手写命名管道: 完整代码&am…

多线程(七):单例模式指令重排序

目录 1. 单例模式 1.1 饿汉模式 1.2 懒汉模式 2. 懒汉模式下的问题 2.1 线程安全问题 2.2 如何解决 --- 加锁 2.3 加锁引入的新问题 --- 性能问题 2.4 指令重排序问题 2.4.1 指令重排序 2.4.2 指令重排序引发的问题 1. 单例模式 单例模式, 是设计模式中最典型的一种模…

Vision China 2024 | 移远通信以一体化的AI训练及部署能力,引领3C电子制造智能升级

10月14日,由机器视觉产业联盟(CMVU)主办的中国机器视觉展(Vision China)在深圳国际会展中心盛大开幕。作为全球领先的物联网整体解决方案供应商,移远通信应邀参加展会首日举办的“智造引领数质并进”3C电子制造自动化与数字化论坛。 论坛上,移…

PostgreSQL学习笔记:PostgreSQL vs MySQL

PostgreSQL 和 MySQL 都是广泛使用的关系型数据库管理系统,它们有以下一些对比: 一、功能特性 1. 数据类型支持 PostgreSQL:支持丰富的数据类型,包括数组、JSON、JSONB、范围类型、几何类型等。对于复杂数据结构的存储和处理非…

rancher安装并快速部署k8s 管理集群工具

主机准备 准备4台主机 3台用于k8s集群 ,1台用于rancher 每台服务器新增配置文件 vi etc/sysctl.confnet.ipv4.ip_forward 1 刷新生效 sysctl –p 安装docker 安装的时候可以去github上检索rancher看看最新版本适配那个版本的docker,这里安装23.0.1…

酸碱PH值与浓度关系

1. 硫酸百分比浓度是指溶液中硫酸的质量占溶液总质量的百分比。‌ 例如,如果100克溶液中含有98克的硫酸,那么硫酸的百分比浓度为98% 2. 1mol/L硫酸对应百分比浓度多少?答:硫酸的质量分数98,1mol/L硫酸98g/L9.8%的硫酸…