当前位置: 首页 > news >正文

zdpgo_gin_zap 整合zdpgo_gin框架和zdpgo_zap框架的日志中间件,用于实现路由日志记录

zdpgo_gin_zap

整合zdpgo_gin框架和zdpgo_zap框架的日志中间件,用于实现路由日志记录

安装

go get github.com/zhangdapeng520/zdpgo_gin_zap

使用教程

基本用法

package mainimport ("fmt""time"gin "github.com/zhangdapeng520/zdpgo_gin"ginzap "github.com/zhangdapeng520/zdpgo_gin_zap"zap "github.com/zhangdapeng520/zdpgo_zap"
)func main() {r := gin.New()// 创建日志logger, _ := zap.NewProduction()// 添加日志中间件r.Use(ginzap.Ginzap(logger, time.DateTime, true))// 添加捕获中间件r.Use(ginzap.RecoveryWithZap(logger, true))// 普通的示例r.GET("/ping", func(c *gin.Context) {c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})// 异常示例r.GET("/panic", func(c *gin.Context) {panic("An unexpected error happen!")})// 启动服务if err := r.Run(":8080"); err != nil {panic(err)}
}

使用自定义的配置

package mainimport ("bytes""fmt""io""time"gin "github.com/zhangdapeng520/zdpgo_gin"ginzap "github.com/zhangdapeng520/zdpgo_gin_zap"zap "github.com/zhangdapeng520/zdpgo_zap""github.com/zhangdapeng520/zdpgo_zap/zapcore"
)func main() {r := gin.New()logger, _ := zap.NewProduction()// 使用详细的配置r.Use(ginzap.GinzapWithConfig(logger, &ginzap.Config{UTC:        true,TimeFormat: time.RFC3339,Context: ginzap.Fn(func(c *gin.Context) []zapcore.Field {fields := []zapcore.Field{}// 记录请求IDif requestID := c.Writer.Header().Get("X-Request-Id"); requestID != "" {fields = append(fields, zap.String("request_id", requestID))}// 记录链路追踪ID//if trace.SpanFromContext(c.Request.Context()).SpanContext().IsValid() {//	fields = append(fields, zap.String("trace_id", trace.SpanFromContext(c.Request.Context()).SpanContext().TraceID().String()))//	fields = append(fields, zap.String("span_id", trace.SpanFromContext(c.Request.Context()).SpanContext().SpanID().String()))//}// 记录请求体信息var body []bytevar buf bytes.Buffertee := io.TeeReader(c.Request.Body, &buf)body, _ = io.ReadAll(tee)c.Request.Body = io.NopCloser(&buf)fields = append(fields, zap.String("body", string(body)))return fields}),}))// Example ping request.r.GET("/ping", func(c *gin.Context) {c.Writer.Header().Add("X-Request-Id", "1234-5678-9012")c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})r.POST("/ping", func(c *gin.Context) {c.Writer.Header().Add("X-Request-Id", "9012-5678-1234")c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})// Listen and Server in 0.0.0.0:8080if err := r.Run(":8080"); err != nil {panic(err)}
}

指定路径不记录日志

package mainimport ("fmt""time"gin "github.com/zhangdapeng520/zdpgo_gin"ginzap "github.com/zhangdapeng520/zdpgo_gin_zap"zap "github.com/zhangdapeng520/zdpgo_zap"
)func main() {r := gin.New()logger, _ := zap.NewProduction()r.Use(ginzap.GinzapWithConfig(logger, &ginzap.Config{UTC:        true,TimeFormat: time.RFC3339,Skipper: func(c *gin.Context) bool {return c.Request.URL.Path == "/ping" && c.Request.Method == "GET"},}))// Example ping request.r.GET("/ping", func(c *gin.Context) {c.Writer.Header().Add("X-Request-Id", "1234-5678-9012")c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})r.POST("/ping", func(c *gin.Context) {c.Writer.Header().Add("X-Request-Id", "9012-5678-1234")c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})// Listen and Server in 0.0.0.0:8080if err := r.Run(":8080"); err != nil {panic(err)}
}

指定正则匹配路径不记录日志

package mainimport ("fmt""regexp""time"gin "github.com/zhangdapeng520/zdpgo_gin"ginzap "github.com/zhangdapeng520/zdpgo_gin_zap"zap "github.com/zhangdapeng520/zdpgo_zap"
)func main() {r := gin.New()logger, _ := zap.NewProduction()rxURL := regexp.MustCompile(`^/ping\s*`)r.Use(ginzap.GinzapWithConfig(logger, &ginzap.Config{UTC:             true,TimeFormat:      time.RFC3339,SkipPathRegexps: []*regexp.Regexp{rxURL},}))// Example ping request.r.GET("/ping1234", func(c *gin.Context) {c.String(200, "pong "+fmt.Sprint(time.Now().Unix()))})// Listen and Server in 0.0.0.0:8080if err := r.Run(":8080"); err != nil {panic(err)}
}

版本

v0.1.0

  • 初始代码

相关文章:

zdpgo_gin_zap 整合zdpgo_gin框架和zdpgo_zap框架的日志中间件,用于实现路由日志记录

zdpgo_gin_zap 整合zdpgo_gin框架和zdpgo_zap框架的日志中间件,用于实现路由日志记录 安装 go get github.com/zhangdapeng520/zdpgo_gin_zap使用教程 基本用法 package mainimport ("fmt""time"gin "github.com/zhangdapeng520/zdpg…...

FOC电流环

interrupt void ISRTimer0(void) { IQ_Ref2.2;//在电流环下给负电流电机反转 IQ_Fdbiq; IQ_ErrorIQ_Ref-IQ_Fdb; IQ_UpIQ_Kp*IQ_Error; IQ_UiIQ_Ui IQ_Ki*IQ_Up IQ_Kc*IQ_SatErr…...

工业设备数据采集方案的设计实施与应用-天拓四方

随着工业4.0时代的来临,工业设备数据采集成为了提升生产效率、优化能源管理、实现智能化决策的关键环节。本文将围绕工业设备数据采集的重要性、方案设计实施以及TDE工业网关的应用实践展开探讨,以期为相关企业提供一种清晰、专业且实操性强的数据采集方…...

【MySQL】索引——索引的实现、B+ vs B、聚簇索引 VS 非聚簇索引、索引操作、创建索引、查询索引、删除索引

文章目录 MySQL5. 索引的实现5.1 B vs B5.2 聚簇索引 VS 非聚簇索引 6. 索引操作6.1 创建主键索引6.2 创建唯一索引6.3 创建普通索引6.4 创建全文索引6.5 查询索引6.6 删除索引 MySQL 5. 索引的实现 因为MySQL和磁盘交互的基本单位为Page(页)。 MySQL 中…...

剖析HTML 元素——WEB开发系列02

HTML元素是构成HTML文档结构的基本单位,定义了页面上的不同部分和内容。HTML元素可以包含不同类型的内容,如文本、图片、链接、表格等,每种元素都有其特定的用途和语义。通过组合和嵌套不同的HTML元素,可以创建复杂的网页结构和布…...

影响3D打印零件品质的关键因素探析

随着科技的飞速发展,3D打印技术作为一种革命性的制造方式,正逐渐渗透到各个行业和领域。然而,尽管3D打印技术在设计和制造上带来了前所未有的灵活性和效率,但其零件品质却受到多种因素的复杂影响。本文将从设备性能、材料选择、工…...

Oracle事务是怎么练成的

什么是事务 事务是数据库管理系统执行过程的一个逻辑单位,由一系列有限的数据库操作序列构成,事务必须满足‌ACID属性。ACID理论是数据库中最重要的概念之一,分别代表原子性(Atomicity)、一致性(Consisten…...

线程与多线程(一)

线程与多线程(一) 一、线程1、概念2、示意图3、虚拟地址转换到物理地址4、与进程相比的优点5、与进程相比的缺点6、与进程的关系(1)线程独有(2)共享(3)示意图 二、POSIX线程库三、创…...

连接其他主机上的redis连接不上`telnet: Unable to connect to remote host: Connection refused`

telnet: Unable to connect to remote host: Connection refused 这个错误通常表示目标主机(192.168.8.29)上的服务(6379端口)没有运行,或者主机的防火墙/网络设置阻止了连接。 你可以尝试以下步骤来解决问题&#xf…...

dijkstral算法详解

import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Map;public class test39 {// 定义节点类,表示图中的顶点public static class Node {public int value; // 节点的值,即编号public int in; // 进入…...

创意指南丨AR数学沉浸式空间体验

AR学习种类那么多,哪款最吸引你? 星河造梦坊和Unity联手打造的沉浸式空间AR无疑是其中的佼佼者。 这款应用不仅利用AR技术将抽象的数学概念变得生动有趣,还通过互动体验让学习者仿佛置身于一个充满奇幻色彩的数学世界中。 无论是学生还是教…...

linux文件——深度学习文件fd、文件系统调用

前言:从本片开始正式进入linux文件的学习,本片内容主要是文件的fd。 本篇内容博主将要先带友友回忆C语言中的文件操作接口,然后再过渡到操作系统中的系统调用的学习,最后理解操作系统中的文件操作。 ps:本节内容设计一…...

003集——C#数据类型 及大小端序转换——C#学习笔记

如需得到一个类型或一个变量在特定平台上的准确尺寸,可以使用 sizeof 方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。下面举例获取任何机器上 int 类型的存储尺寸: using System;namespace DataTypeApplication {class Program{…...

结构化输出及其使用方法

在 LLM 应用程序中构建稳健性和确定性 图片来自作者 欢迎来到雲闪世界。OpenAI最近宣布其最新的gpt-4o-2024–08–06模型支持结构化输出。与大型语言模型 (LLM) 相关的结构化输出并不是什么新鲜事——开发人员要么使用各种快速工程技术,要么使用第三方工具。 在本文…...

yolov8人脸识别案例

GitHub - wangWEI201901/YOLOv8-Detection-Project: 🛣️基于YOLOv8的智慧校园人脸识别和公路汽车检测...

成员变量在Java中的定义与使用

成员变量在Java中的定义与使用 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在本文中,我们将详细探讨Java中的成员变量,包括其定义、使用以及各种类型的成员变量示例。 成员…...

Python开发工具PyCharm入门指南 - 用户界面主题更改

JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 界面主题定义了窗口、对话框、按钮和用户界面的所有可视元素的外观…...

TCP网络套接字

一、创建套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); 参数&#xff1a; domain&#xff1a;指定使用的协议族。常见的取值有AF_INET&#xff08;IPv4&#xff09;和AF_INET6&#xff08;IPv6&a…...

Element学习(axios异步加载数据、案例操作)(5)

1、这次学习的是上次还未完成好的恶element案例&#xff0c;对列表数据的异步加载&#xff0c;并渲染展示。 ——>axios来发送异步请求 &#xff08;1&#xff09; &#xff08;2&#xff09;在vue当中安装axios &#xff08;注意在当前的项目目录&#xff0c;并且安装完之后…...

大数据-65 Kafka 高级特性 分区 Broker自动再平衡 ISR 副本 宕机恢复再重平衡 实测

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

Pandas 操作指南(一):DataFrame 的构建与表格数据组织

在数据分析与数据处理中&#xff0c;原始数据往往并不是一开始就以规范表格的形式出现。它可能来自列表&#xff08;list&#xff09;、字典&#xff08;dict&#xff09;、CSV/Excel 文件&#xff0c;或程序运行过程中临时生成的数据集合。若这些数据尚未被整理为结构明确的表…...

旧手机秒变电脑摄像头:DroidCam创新应用指南

旧手机秒变电脑摄像头&#xff1a;DroidCam创新应用指南 【免费下载链接】droidcam GNU/Linux/nix client for DroidCam 项目地址: https://gitcode.com/gh_mirrors/dr/droidcam 在远程办公与在线协作日益普及的今天&#xff0c;高质量摄像头成为必备工具。然而专用摄像…...

Pixel Couplet Gen效果展示:基于用户画像(年龄/地域)的像素春联风格个性化推荐

Pixel Couplet Gen效果展示&#xff1a;基于用户画像&#xff08;年龄/地域&#xff09;的像素春联风格个性化推荐 1. 项目概览 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。通过ModelScope大模型的强大生成能力&#xff0c;结合精心设计的8-…...

MinerU智能文档理解服务:专为高密度文本图像设计的轻量级解决方案

MinerU智能文档理解服务&#xff1a;专为高密度文本图像设计的轻量级解决方案 1. 引言&#xff1a;文档处理的智能化革命 在数字化办公时代&#xff0c;我们每天都要面对大量PDF文档、扫描件和图像资料。这些文件往往包含复杂的版面结构&#xff1a;多栏排版、嵌套表格、数学…...

基于U-Net的肺部CT结节检测系统设计与实现

摘要&#xff1a;肺癌是当前威胁人类健康的重要疾病之一&#xff0c;肺结节作为肺癌早期筛查和诊断的重要影像学表现&#xff0c;其准确检测具有重要意义。CT影像因具有较高的空间分辨率&#xff0c;被广泛应用于肺部疾病检查。然而&#xff0c;传统人工阅片方式存在工作量大、…...

【 Claw-Code】 技术深度解析:Claude Code Agent Harness 的开源重实现

文章目录Claw-Code 技术深度解析&#xff1a;Claude Code Agent Harness 的开源重实现一、引言二、项目背景与定位2.1 为什么是"洁室重实现"2.2 项目核心目标三、双语言架构设计3.1 双语言实现对比3.2 Rust Workspace 模块划分四、核心组件解析4.1 运行时&#xff08…...

别只盯着PID!用STM32的PWM差速控制,让你的循迹小车转弯更稳(附源码分析)

STM32 PWM差速控制&#xff1a;让循迹小车转弯更稳的实战技巧 循迹小车的核心挑战之一是如何实现平滑稳定的转弯控制。许多开发者习惯性地直接套用PID算法&#xff0c;却忽略了更基础的PWM差速控制策略。实际上&#xff0c;通过精心设计的PWM占空比调整方案&#xff0c;完全可以…...

OpenClaw移动办公:Phi-3-mini-128k-instruct通过钉钉审批电子合同

OpenClaw移动办公&#xff1a;Phi-3-mini-128k-instruct通过钉钉审批电子合同 1. 为什么需要移动审批电子合同&#xff1f; 上周三我在高铁上收到法务同事的紧急消息&#xff1a;"有个供应商合同今天必须签完&#xff0c;但关键条款需要你确认"。当时手边既没电脑也…...

嵌入式字符LCD进度条库:LcdProgressBar轻量实现

1. 项目概述LcdProgressBar是一个面向嵌入式 LCD 显示场景的轻量级进度条绘制库&#xff0c;专为基于字符型液晶显示屏&#xff08;Character LCD&#xff09;的资源受限系统设计。其核心定位并非替代图形 LCD 的矢量渲染能力&#xff0c;而是以极低内存开销和确定性执行时间&a…...

扩散模型对抗样本经典baselines

1. 流图&#xff1a;数据的河流 如果把传统的堆叠面积图想象成一块块整齐堆叠的积木&#xff0c;那么流图就像一条蜿蜒流淌的河流&#xff0c;河道的宽窄变化自然流畅&#xff0c;波峰波谷过渡平滑。 它特别适合展示多个类别数据随时间的变化趋势&#xff0c;尤其是当你想强调整…...