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端口)没有运行,或者主机的防火墙/网络设置阻止了连接。 你可以尝试以下步骤来解决问题…...
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); 参数: domain:指定使用的协议族。常见的取值有AF_INET(IPv4)和AF_INET6(IPv6&a…...

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

大数据-65 Kafka 高级特性 分区 Broker自动再平衡 ISR 副本 宕机恢复再重平衡 实测
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...
C#合并CAN ASC文件:实现与优化
C#合并CAN ASC文件:实现与优化 在汽车电子和工业控制领域,CAN(Controller Area Network)总线是一种广泛使用的通信协议。CAN ASC(American Standard Code)文件则是记录CAN总线通信数据的标准格式ÿ…...

[TIP] Ubuntu 22.04 配置多个版本的 GCC 环境
问题背景 在 Ubuntu 22.04 中安装 VMware 虚拟机时,提示缺少 VMMON 和 VMNET 模块 编译这两个模块需要 GCC 的版本大于 12.3.0,而 Ubuntu 22.04 自带的 GCC 版本为 11.4.0 因此需要安装对应的 GCC 版本,但为了不影响其他程序,需…...

基于AWS Serverless架构:零运维构建自动化SEO内容生成系统
作者:[Allen] 技术专栏 | 深度解析云原生SEO自动化 在流量为王的时代,持续产出高质量SEO内容成为技术运营的核心痛点。传统方案面临开发成本高、扩展性差、关键词响应滞后三大难题。本文将分享如何用AWS Serverless技术栈,构建一套零服务器运…...

第4天:RNN应用(心脏病预测)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: Pytorch (二)具体步骤…...
Redis 与 MySQL 数据一致性保障方案
在高并发场景下,Redis 作为缓存中间件与 MySQL 数据库配合使用时,数据一致性是一个关键挑战。本文将详细探讨如何保障 Redis 与 MySQL 的数据一致性,并结合 Java 代码实现具体方案。 数据不一致的原因分析 在分布式系统中,Redis…...

Linux命令基础(2)
su和exit命令 可以通过su命令切换到root账户 语法:su [-] 用户名 -符号是可选的,表示是否在切换用户后加载环境变量,建议带上 参数:用户名,表示要切换的用户,用户名可以省略,省略表示切换到ro…...

11-Oracle 23ai Vector Embbeding和ONNX
Embedding (模型嵌入)是 AI 领域的一个核心概念 一、Embedding(嵌入)的含义 Embedding 是一种将 非结构化数据(如文本、图像、音频、视频)转换为 数值向量的技术。 其核心是通过 嵌入模型(…...

Java 大视界 -- 基于 Java 的大数据分布式计算在蛋白质组学数据分析中的加速与优化(255)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

OpenVINO环境配置--OpenVINO安装
TOC环境配置–OpenVINO安装 本节内容 OpenVINO 支持的安装方式有很多种,每一种操作系统以及语言都有对应的安装方法,在官网上有很详细的教程: 我们可以根据自己的需要,来点选环境配置和安装方法,然后网页会给出正…...

【反无人机检测】C2FDrone:基于视觉Transformer网络的无人机间由粗到细检测
C2FDrone:基于视觉Transformer网络的无人机间由粗到细检测 C2FDrone: Coarse-to-Fine Drone-to-Drone Detection using Vision Transformer Networks 论文链接 摘要 摘要——基于视觉的无人机间检测系统在碰撞规避、反制敌对无人机和搜救行动等应用中至关重要。然…...