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 loggerimport ("go.uber.org/zap""go.uber.org/zap/zapcore""time"
)// InitZapLogger initializes a zap logger
func InitZapLogger() (*zap.Logger, error) {// Customizing the zap loggerconfig := 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 namesEncodeTime:     zapcore.ISO8601TimeEncoder,    // ISO8601 time formatEncodeDuration: zapcore.SecondsDurationEncoder,EncodeCaller:   zapcore.ShortCallerEncoder,},}return config.Build()
}
3. zap 集成到 gin

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

main.go - 集成 zap 日志到 gin
package mainimport ("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 loggerzapLogger, err := logger.InitZapLogger()if err != nil {panic(err)}defer zapLogger.Sync() // Flush any buffered log entries// Create a new Gin routerr := gin.New()// Custom middleware to log requests with zapr.Use(func(c *gin.Context) {startTime := time.Now()// Process requestc.Next()// Log request detailszapLogger.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 routesr.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})// Start the serverr.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 loggerimport ("os""github.com/sirupsen/logrus"
)// InitLogrusLogger initializes a logrus logger
func InitLogrusLogger() *logrus.Logger {// Create a new instance of the loggerlogger := logrus.New()// Set the output to stdoutlogger.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 mainimport ("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 loggerlog := logger.InitLogrusLogger()// Create a new Gin routerr := gin.New()// Custom middleware to log requests with logrusr.Use(func(c *gin.Context) {startTime := time.Now()// Process requestc.Next()// Log request detailslog.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 routesr.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong",})})// Start the serverr.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.rhkb.cn/news/430418.html

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

相关文章

【机器学习】11——矩阵求导

机器学习11——矩阵求导 打公式不太好标注,全图警告!!! 文章目录 机器学习11——矩阵求导1.1标量对向量1.2标量对矩阵2.1向量对标量2.2向量对向量2.3向量对矩阵 1.1标量对向量 1.2标量对矩阵 X是m*n的矩阵,不严谨&am…

在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路

什么是vitepress vitepress是一种将markdown文件渲染成静态网页的技术 其使用仅需几行命令即可 //在根目录安装vitepress npm add -D vitepress //初始化vitepress,添加相关配置文件,选择主题,描述,框架等 npx vitepress init //…

隐匿发案:David律所代理艺术家Ina Tomecek的两张青蛙版权画维权

案件基本情况:起诉时间:2024-8-14案件号:2024-cv-07196原告:Ina Tomecek原告律所:Law Office of David Gulbransen起诉地:伊利诺伊州北部法院涉案商标/版权:原告品牌简介:Ina Tomece…

内核是如何接收网络包的

1、数据如何从网卡到网络协议栈 1.1内核收包的过程 1、数据帧从外部网络到达网卡 2、网卡把数据帧从自己的缓存DMA(拷贝到)和内核共有的RingBuffer上 3、网卡发出硬中断通知CPU 4、CPU响应硬中断,简单处理后发出软中断 5、k’softirqd线程处理软中断,调…

颍川陈氏——平民崛起的典范

园子说颍川 广州有一处老建筑“陈家祠”,豪华精美堪比皇宫,誉为“岭南建筑艺术明珠”、“新世纪羊城八景”之一,是全国文保单位,4A 级景区。主体建筑以中轴线三座厅堂为中心,由大小十九座单体建筑组成,占地…

Windows如何查看已缓存的DNS信息

Windows server 2016如何查看已缓存的DNS信息 在Windows server 2016系统下,如何查看已缓存的DNS信息呢? 1.打开“运行”,输入cmd,点击“确定” 2.在命令行界面输入ipconfig /displaydns,按回车即可查看已缓存的dns信息

在vue中:style 的几种使用方式

在日常开发中:style的使用也是比较常见的&#xff1a; 亲测有效 1.最通用的写法 <p :style"{fontFamily:arr.conFontFamily,color:arr.conFontColor,backgroundColor:arr.conBgColor}">{{con.title}}</p> 2.三元表达式 <a :style"{height:…

Android15之源码分支qpr、dp、beta、r1含义(二百三十二)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)

文章目录 内部类17.1概述17.2成员内部类17.2.1 获取成员内部类对象17.2.2 成员内部类内存图 17.3静态内部类17.4局部内部类17.5匿名内部类17.5.1概述 内部类 17.1概述 写在一个类里面的类叫内部类,即 在一个类的里面再定义一个类。 如&#xff0c;A类的里面的定义B类&#x…

江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Leetcode990.等式方程的可满足性

题目 原题链接 等式方程的可满足性 思路 定义一个长度为26&#xff08;变量为小写字母&#xff09;的数组充当并查集&#xff0c;并将数组中的元素初始化为 -1判断“”并合并元素&#xff0c;将相等的放在一个集合中判断“!”&#xff1b;不等的如果在一个集合中&#xff0c;则…

应用密码学第一次作业(9.23)

一、Please briefly describe the objectives of information and network security,such as confidentiality, integrity, availability , authenticity , and accountability The objectives of information and network security include: Confidentiality: Protecting se…

【小白向】怎么去除视频水印?HitPaw帮你轻松解决

序言 HitPaw是一款优秀的去除视频水印的工具。 特点&#xff1a;不仅仅能够去除图片、视频里的固定水印&#xff0c;还能去除移动水印。 尤其是它的AI去水印功能&#xff0c;效果非常好。 极简使用教程 下载安装 HitPaw需要在电脑上安装软件才能使用。 支持Windows系统和…

MySQL和SQL的区别简单了解和分析使用以及个人总结

MySQL的基本了解 运行环境&#xff0c;这是一种后台运行的服务&#xff0c;想要使用必须打开后台服务&#xff0c;这个后台服务启动的名字是在安装中定义的如下图&#xff08;个人定义MySQL88&#xff09;区分大小写图片来源 可以使用命令net start/stop 服务名&#xff0c;开…

浮动静态路由

浮动静态路由 首先我们知道静态路由的默认优先级是60&#xff0c;然后手动添加一条静态路由优先级为80的路由作为备份路由。当主路由失效的备份路由就会启动。 一、拓扑图 二、基本配置 1.R1: <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet…

怎么开通GitHub Copilot?不会开通GitHub Copilot?一文看懂

GitHub Copilot 简介 GitHub Copilot 是由 GitHub 推出的一种人工智能编程助手&#xff0c;旨在帮助开发者更快速、更高效地编写代码。GitHub Copilot 是基于 OpenAI 的 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型开发的&#xff0c;它能够通过理解编…

[大语言模型] LINFUSION:1个GPU,1分钟,16K图像

1. 文章 2409.02097 (arxiv.org)https://arxiv.org/pdf/2409.02097 LINFUSION: 1 GPU, 1 MINUTE, 16K IMAGE 摘要 本文介绍了一种新型的扩散模型LINFUSION&#xff0c;它能够在保持高分辨率图像生成性能的同时显著降低时间和内存复杂度。该模型采用了基于Transformer的UNet进…

解决IDEA出现:java: 程序包javax.servlet不存在的问题

问题截图&#xff1a; 解决如下&#xff1a; 1. 点击文件——>项目结构 2. 点击库——>点击——>点击java 3. 找到Tomcat的文件夹&#xff0c;找到lib文件夹中的servlet-api.jar&#xff0c;点击确定 4. 选择要添加的模块 5. 点击应用——>确定

828华为云征文 | 将Vue项目部署到Flexus云服务器X实例并实现公网访问

一、Flexus云服务器X实例简介 1.1 概述 华为云Flexus X实例是华为云推出的一款创新云服务器产品&#xff0c;它主要面向中小企业和开发者&#xff0c;旨在解决传统云服务中的痛点&#xff0c;提供更加灵活、高效的云服务体验。 华为深刻洞察了中小企业和开发者在云服务应用中遇…

分享几种方式获取免费精致的Live2d模型

文章目录 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09;2、模之屋3、unity商店4、直接b站搜索5、youtube6、BOOTH完结 1、 Live2D官方示例数据集&#xff08;可免费下载&#xff09; 官方提供了一些 Live2D实例模型给大家下载使用 地址&#xff1a;https://ww…