uber-go/zap sirupsen/logrus

文章目录

      • `uber-go/zap` 和 `sirupsen/logrus`日志库对比
        • 1. **性能**
        • 2. **易用性和灵活性**
        • 3. **结构化日志**
        • 4. **生态系统和可扩展性**
        • 5. **输出格式**
        • 6. **使用场景**
        • 总结
      • Zap库在Gin中的实践
        • 1. **安装 `zap`**
        • 2. **封装 `zap` 日志**
        • `logger.go` - 封装 `zap` 日志
        • 3. **将 `zap` 集成到 `gin` 中**
        • `main.go` - 集成 `zap` 日志到 `gin`
        • 4. **说明**
        • 5. **运行项目**
      • logrus在GIN中的实践
        • 1. **安装 `logrus`**
        • 2. **封装 `logrus` 日志**
        • `logger.go` - 封装 `logrus` 日志
        • 3. **将 `logrus` 集成到 `gin` 中**
        • `main.go` - 集成 `logrus` 日志到 `gin`
        • 4. **说明**
        • 5. **运行项目**

uber-go/zapsirupsen/logrus日志库对比

uber-go/zapsirupsen/logrus 是 Go 中两个常用的日志库,各有其优点和适用场景。以下是对这两个库的对比以及它们的使用场景:

1. 性能
  • Zap

    • 以高性能和低内存分配著称。
    • 以效率为核心设计,使用预分配的 JSON 编码器,避免了反射的使用。
    • 适用于日志记录频繁、对性能要求极高的高吞吐量应用(例如微服务、实时系统)。
  • Logrus

    • 更易用,但性能较 Zap 慢。
    • 使用反射,提供更简单的接口,但会带来一定的性能开销。
    • 适合那些易用性和灵活性比纯性能更重要的应用(例如命令行工具、内部工具)。
2. 易用性和灵活性
  • Zap

    • 提供两种模式:SugaredLogger(更易用,性能略低)和 Logger(高性能,灵活性较低)。
    • 创建结构化日志时相对更冗长,灵活性不如 Logrus。
    • 由于注重性能,设置较复杂,学习曲线更陡峭。
  • Logrus

    • 用户友好的 API,可轻松创建结构化日志。
    • 使用反射提供更直观的结构化日志接口。
    • 更灵活,上手更容易,适合初学者或简单项目。
3. 结构化日志
  • Zap

    • 默认专注于结构化日志。

    • 使用强类型字段,提高类型安全性,减少运行时错误的可能性。

    • 示例:

      logger.Info("User login",
          zap.String("username", "john_doe"),
          zap.Int("user_id", 42),
      )
      
  • Logrus

    • 支持使用字段的结构化日志,在添加字段方面更灵活。

    • 示例:

      logrus.WithFields(logrus.Fields{
          "username": "john_doe",
          "user_id":  42,
      }).Info("User login")
      
4. 生态系统和可扩展性
  • Zap

    • 与 Logrus 相比,内置钩子较少,更关注核心性能。
    • 支持自定义编码器和高级配置,用于不同的输出格式。
  • Logrus

    • 丰富的生态系统,包含许多内置钩子和第三方扩展。
    • 易于扩展并集成到不同的日志后端,例如将日志发送到外部系统(例如 ElasticSearch、Logstash)。
5. 输出格式
  • Zap

    • 主要输出 JSON 格式,适合结构化日志和机器解析。
    • 支持控制台编码,但在输出定制方面灵活性不如 Logrus。
  • Logrus

    • 默认提供更易读的人类可读格式,如文本格式,方便在开发或调试期间阅读。
    • 也支持 JSON 输出,允许轻松定制输出格式。
6. 使用场景
  • Zap

    • 高性能服务、微服务、实时系统以及日志记录可能成为瓶颈的应用。
    • 需要结构化日志以进行日志解析和分析的系统。
  • Logrus

    • 当易用性和灵活性比性能更重要的应用。
    • 命令行工具、开发环境或内部工具,适合需要人类可读日志的场景。
总结
  • 使用 Zap 如果你需要最高的性能,且应用的高吞吐量对结构化日志和最小化开销有严格要求。
  • 使用 Logrus 如果你更注重易用性和灵活性,应用的性能不是首要考虑因素,或者需要与各种日志后端轻松集成。

在许多情况下,选择取决于应用的具体需求,比如所需的性能水平以及对易用性和效率的重视程度。

Zap库在Gin中的实践

要在 gin 项目中使用 uber-go/zap 并将其封装成一个可复用的函数,可以按照以下步骤进行:

1. 安装 zap

首先,确保你的项目中安装了 zap

go get -u go.uber.org/zap
2. 封装 zap 日志

创建一个封装 zap 日志初始化和使用的函数。以下是一个示例代码,包括了如何将 zap 日志集成到 gin 中:

logger.go - 封装 zap 日志
package logger

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"time"
)

// InitZapLogger initializes a zap logger
func InitZapLogger() (*zap.Logger, error) {
	// Customizing the zap logger
	config := zap.Config{
		Encoding:         "json", // or "console"
		Level:            zap.NewAtomicLevelAt(zap.InfoLevel),
		OutputPaths:      []string{"stdout"},
		ErrorOutputPaths: []string{"stderr"},
		EncoderConfig: zapcore.EncoderConfig{
			TimeKey:        "time",
			LevelKey:       "level",
			NameKey:        "logger",
			CallerKey:      "caller",
			MessageKey:     "msg",
			StacktraceKey:  "stacktrace",
			LineEnding:     zapcore.DefaultLineEnding,
			EncodeLevel:    zapcore.LowercaseLevelEncoder, // Lowercase level names
			EncodeTime:     zapcore.ISO8601TimeEncoder,    // ISO8601 time format
			EncodeDuration: zapcore.SecondsDurationEncoder,
			EncodeCaller:   zapcore.ShortCallerEncoder,
		},
	}
	
	return config.Build()
}
3. zap 集成到 gin

gin 项目中,使用中间件将 zap 集成到 HTTP 请求处理流程中。

main.go - 集成 zap 日志到 gin
package main

import (
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"your_project/logger" // Replace with the correct path to logger.go
	"time"
)

func main() {
	// Initialize zap logger
	zapLogger, err := logger.InitZapLogger()
	if err != nil {
		panic(err)
	}
	defer zapLogger.Sync() // Flush any buffered log entries

	// Create a new Gin router
	r := gin.New()

	// Custom middleware to log requests with zap
	r.Use(func(c *gin.Context) {
		startTime := time.Now()
		
		// Process request
		c.Next()
		
		// Log request details
		zapLogger.Info("Incoming request",
			zap.String("method", c.Request.Method),
			zap.String("path", c.Request.URL.Path),
			zap.Int("status", c.Writer.Status()),
			zap.Duration("latency", time.Since(startTime)),
			zap.String("client_ip", c.ClientIP()),
		)
	})

	// Define routes
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})

	// Start the server
	r.Run(":8080")
}
4. 说明
  • InitZapLogger: 封装了 zap 的初始化逻辑,创建了一个 json 格式的日志配置。可以根据需要调整日志级别、输出路径和编码格式。
  • Gin 中间件: 在 gin 中注册一个中间件,记录 HTTP 请求的基本信息(如方法、路径、状态码、耗时等)到 zap 日志。
  • 日志输出: 日志被格式化为 JSON 格式,并输出到标准输出(stdout),但你也可以将其配置为输出到文件或其他位置。
5. 运行项目

运行项目后,访问 http://localhost:8080/ping,你将在控制台看到 zap 格式化的日志输出,如:

{"level":"info","time":"2024-09-19T12:34:56.789+0800","caller":"main.go:23","msg":"Incoming request","method":"GET","path":"/ping","status":200,"latency":0.001234,"client_ip":"127.0.0.1"}

通过这种方式,你可以将 zap 日志记录集成到 gin 项目中,并通过中间件捕获和记录 HTTP 请求的相关信息。

要在 gin 项目中使用 sirupsen/logrus 并封装成一个可复用的函数,可以按照以下步骤进行:

logrus在GIN中的实践

1. 安装 logrus

首先,确保在你的项目中安装了 logrus

go get -u github.com/sirupsen/logrus
2. 封装 logrus 日志

创建一个封装 logrus 日志初始化和使用的函数。以下是一个示例代码,包括了如何将 logrus 日志集成到 gin 中:

logger.go - 封装 logrus 日志
package logger

import (
	"os"

	"github.com/sirupsen/logrus"
)

// InitLogrusLogger initializes a logrus logger
func InitLogrusLogger() *logrus.Logger {
	// Create a new instance of the logger
	logger := logrus.New()

	// Set the output to stdout
	logger.Out = os.Stdout

	// Set the log level (e.g., Info, Warn, Error)
	logger.SetLevel(logrus.InfoLevel)

	// Set the log format to JSON (or Text)
	logger.SetFormatter(&logrus.JSONFormatter{
		TimestampFormat: "2006-01-02 15:04:05",
	})
	
	// Alternatively, use TextFormatter for more readable output
	// logger.SetFormatter(&logrus.TextFormatter{
	//     FullTimestamp: true,
	// })

	return logger
}
3. logrus 集成到 gin

gin 项目中,使用中间件将 logrus 集成到 HTTP 请求处理流程中。

main.go - 集成 logrus 日志到 gin
package main

import (
	"time"

	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"your_project/logger" // Replace with the correct path to logger.go
)

func main() {
	// Initialize logrus logger
	log := logger.InitLogrusLogger()

	// Create a new Gin router
	r := gin.New()

	// Custom middleware to log requests with logrus
	r.Use(func(c *gin.Context) {
		startTime := time.Now()

		// Process request
		c.Next()

		// Log request details
		log.WithFields(logrus.Fields{
			"method":     c.Request.Method,
			"path":       c.Request.URL.Path,
			"status":     c.Writer.Status(),
			"latency":    time.Since(startTime),
			"client_ip":  c.ClientIP(),
		}).Info("Incoming request")
	})

	// Define routes
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})

	// Start the server
	r.Run(":8080")
}
4. 说明
  • InitLogrusLogger: 这个函数初始化了一个 logrus 日志实例。你可以根据需要设置日志级别和输出格式(如 JSON 或文本)。
  • Gin 中间件: 在 gin 中注册一个中间件,记录 HTTP 请求的基本信息(如方法、路径、状态码、耗时等)到 logrus 日志。
  • 日志输出: 日志被格式化为 JSON 格式,并输出到标准输出(stdout)。你也可以选择 TextFormatter 来生成更易读的输出。
5. 运行项目

运行项目后,访问 http://localhost:8080/ping,你将在控制台看到 logrus 格式化的日志输出,例如:

{"client_ip":"127.0.0.1","latency":0.001234,"method":"GET","path":"/ping","status":200,"time":"2024-09-19T12:34:56+08:00","msg":"Incoming request","level":"info"}

或者使用 TextFormatter 时:

time="2024-09-19 12:34:56" level=info msg="Incoming request" client_ip=127.0.0.1 latency=0.001234 method=GET path=/ping status=200

通过这种方式,你可以将 logrus 日志记录集成到 gin 项目中,并通过中间件捕获和记录 HTTP 请求的相关信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:概述 --- 体系结构

目录 一. 体系结构总览 1.1 OSI七层协议体系结构 1.2 TCP/IP四层(或五层)模型结构 二. 数据传输过程 2.1 同网段传输 2.2 跨网段传输 三. 体系结构相关概念 3.1 实体 3.2 协议 3.3 服务 这里我们专门来讲一下计算机网络中的体系结构。其实我们之前…

前端组件库Element UI 的使用

一、准备工作 1.确保安装了开发软件 VS Code(此处可查阅安装 VS Code教程),确保相关插件安装成功 2.安装Node.js 和创建Vue项目(此处可查阅安装创建教程) 3.成功在VS Code运行一个Vue项目(此处可查阅运行…

Pybullet 安装过程

Pybullet 安装过程(windows) 1. 安装C编译工具2. 安装Pybullet 1. 安装C编译工具 pybullet 需要C编译套件,直接装之前检查下,要不会报缺少某版本MVSC的error,最好的方式是直接下载visual studio,直接按默认…

信息安全工程师(8)网络新安全目标与功能

前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要,它们不仅反映了网络安全领域的最新发展趋势,也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对: 目标:建立多层次、全方位的网络安全防…

【渗透测试】-vulnhub源码框架漏洞-Os-hackNos-1

vulnhub源码框架漏洞中的CVE-2018-7600-Drupal 7.57 文章目录  前言 1.靶场搭建: 2.信息搜集: 主机探测: 端口扫描: 目录扫描: 3.分析: 4.步骤: 1.下载CVE-2018-7600的exp 2.执行exp: 3.写入木…

【C++篇】引领C++模板初体验:泛型编程的力量与妙用

文章目录 C模板编程前言第一章: 初始模板与函数模版1.1 什么是泛型编程?1.1.1 为什么要有泛型编程?1.1.1 泛型编程的优势 1.2 函数模板的基础1.2.1 什么是函数模板?1.2.2 函数模板的定义格式1.2.3 示例:通用的交换函数输出示例&am…

Redis面试真题总结(四)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ AOF 持久化? AOF(Append Only File&#x…

ETCD学习使用

一、介绍 etcd(分布式键值存储)是一个开源的分布式系统工具,用于可靠地存储和提供键值对数据。etcd 通常通过 HTTP 或 gRPC 提供 API,允许应用程序通过简单的接口与其交互。由于其可靠性和稳定性,etcd 在构建可扩展、分…

【OpenAI o1背后技术】Sef-play RL:LLM通过博弈实现进化

【OpenAI o1背后技术】Sef-play RL:LLM通过博弈实现进化 OpenAI o1是经过强化学习训练来执行复杂推理任务的新型语言模型。特点就是,o1在回答之前会思考——它可以在响应用户之前产生一个很长的内部思维链。也就是该模型在作出反应之前,需要…

k8s中pod的创建过程和阶段状态

管理k8s集群 kubectl k8s中有两种用户 一种是登录的 一种是/sbin/nologin linux可以用密码登录,也可以用证书登录 k8s只能用证书登录 谁拿到这个证书,谁就可以管理集群 在k8s中,所有节点都被网络组件calico设置了路由和通信 所以pod的ip是可以…

WebRTC编译后替换libwebrtc.aar时提示找不到libjingle_peerconnection_so.so库

Loading native library: jingle_peerconnection_so 问题原因:编译的时候只编译了armeabi-v7a的版本,但是应用程序是arm64-v8a,所以无法运行 解决方法:更新编译脚本,加上arm64-v8a进行编译 ./tools_webrtc/android/bu…

【漏洞复现】用友 NC-Cloud queryStaffByName Sql注入漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

windows 驱动实例分析系列-COM驱动案例讲解

COM也被称之为串口,这是一种非常简单的通讯接口,这种结构简单的接口被广泛的应用在开发中,几乎所有系统都能支持这种通讯接口,它有RS232和RS485等分支,但一般我们都会使用RS232作为常见的串口,因为它足够简单和高效。 几乎所有的开发板,都会提供用于烧录、调试、日志的…

常见中间件漏洞(Apache)

CVE-2021-41773 搭建环境 docker pull blueteamsteve/cve-2021-41773:no-cgid curl http://192.168.10.190:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd 工具 验证

银河麒麟高级服务器操作系统V10:提升普通用户操作权限

银河麒麟高级服务器操作系统V10:提升普通用户操作权限 1. 打开终端2. 切换到root用户(可选)3. 将用户加入到wheel组4. 验证用户组变更5. 使用sudo执行命令结论 💖The Begin💖点点关注,收藏不迷路&#x1f4…

神经网络面试题目

1. 批规范化(Batch Normalization)的好处都有啥?、 A. 让每一层的输入的范围都大致固定 B. 它将权重的归一化平均值和标准差 C. 它是一种非常有效的反向传播(BP)方法 D. 这些均不是 正确答案是:A 解析: ‌‌‌‌  batch normalization 就…

ChatGPT 在国内使用的方法

AI如今很强大,聊聊天、写论文、搞翻译、写代码、写文案、审合同等等,ChatGPT 真是无所不能~ 作为一款出色的大语言模型,ChatGPT 实现了人类般的对话交流,最主要是能根据上下文进行互动。 接下来,我将介绍 ChatGPT 在国…

docker|Oracle数据库|docker快速部署Oracle11g和数据库的持久化(可用于生产环境)

一、 容器数据持久化的概念 docker做为容器化的领先技术,现在广泛应用于各个平台中,但不知道什么时候有一个说法是docker并不适用容器化数据库,说容器化的数据库性能不稳定,其实,这个说法主要是因为对docker的数据持…

电气设备施工现场风险状态判断ai模型训练数据集

电气设备施工现场风险状态判断ai模型训练数据集 id:18 电气设备施工现场工人人工智能学习数据和工作环境安全数据,建立系统化管理体系,改变全球EHS范式,预防工业事故。数据集记录了387709例子电力设施建设以及施工现场相关的灾害安全环境数据…

Python进阶学习笔记(一)对象

1.对象模型 在面向对象理论中类和对象是不同的概念,而在python中类也是对象,叫做类型对象。 所以python中的类,实例对象,类型都是对象。 元类型: 在python中实例对象的类型为对应类型的对象,而类型的对象…