首页 > 其他分享 >Mygin中间件优化及logger日志中间件

Mygin中间件优化及logger日志中间件

时间:2024-01-30 15:12:32浏览次数:16  
标签:case return func 中间件 Mygin context http logger

本篇是mygin的第七篇,参照gin框架,感兴趣的可以从 Mygin第一篇 开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现。

目的

  • 中间件Middleware优化
  • 默认log日志中间件
    在上篇 Mygin实现中间件Middleware 中间件Middleware很生硬,完全依赖循环,如果某个中间件想要cover住全部中间件,比如我想记录,整个请求的耗时时间,以便针对优化的功能。因此需要把之前生硬的方式做一些修改。

修改

1.实例化上下文修改
//实例化一个下上文
	c := &Context{
		Request:  r,
		Writer:   w,
		Params:   params,
		handlers: handlers,
		index:    -1, //默认下标为-1
	}
2.修改上下文Next方法
// Next 执行链中的剩余处理程序。
func (c *Context) Next() {
	c.index++
	//遍历handlers
	for c.index < int8(len(c.handlers)) {
		//真正调用执行handler方法
		c.handlers[c.index](c)
		c.index++
	}
}

日志

参照(复制)gin中的写法,新建mygin/logger.go日志中间件文件。

  • mygin/logger.go
package mygin

import (
	"fmt"
	"net/http"
	"time"
)

const (
	green   = "\033[97;42m" // 绿色
	white   = "\033[90;47m" // 白色
	yellow  = "\033[90;43m" // 黄色
	red     = "\033[97;41m" // 红色
	blue    = "\033[97;44m" // 蓝色
	magenta = "\033[97;45m" // 洋红色
	cyan    = "\033[97;46m" // 青色
	reset   = "\033[0m"     // 重置颜色
)

type LogFormatterParams struct {
}

// MethodColor 方法颜色获取
func (l *LogFormatterParams) MethodColor(method string) string {
	switch method {
	case http.MethodGet:
		return blue
	case http.MethodPost:
		return cyan
	case http.MethodPut:
		return yellow
	case http.MethodDelete:
		return red
	case http.MethodPatch:
		return green
	case http.MethodHead:
		return magenta
	case http.MethodOptions:
		return white
	default:
		return reset
	}
}

// StatusCodeColor 状态颜色获取
func (l *LogFormatterParams) StatusCodeColor(code int) string {
	switch {
	case code >= http.StatusOK && code < http.StatusMultipleChoices:
		return green
	case code >= http.StatusMultipleChoices && code < http.StatusBadRequest:
		return white
	case code >= http.StatusBadRequest && code < http.StatusInternalServerError:
		return yellow
	default:
		return red
	}
}

// LoggerFunc 记录日志的方法
func (l *LogFormatterParams) LoggerFunc() HandlerFunc {
	return func(context *Context) {
		// 启动时间
		start := time.Now()

		// 后续处理请求
		context.Next()

        //后续处理请求 结束时间
		now := time.Now()

		str := fmt.Sprintf("[MyGIN] %v |%s %3d %s| %13v  |%s %-7s %s %#v\n",
			now.Format("2006/01/02 - 15:04:05"),
			l.StatusCodeColor(context.status), context.status, reset,
			now.Sub(start), //耗时
			l.MethodColor(context.Request.Method), context.Request.Method, reset,
			context.Request.URL.Path,
		)
		fmt.Println(str)
	}
}

日志中间件

测试

测试代码

package mygin

import (
	"net/http"
	"path"
	"testing"
)

func TestMyGin06(t *testing.T) {
	r := Default()
	r.Use()
	//测试需要登录
	group := r.Group("/api", func(context *Context) {
		//todo....
		context.String(http.StatusOK, "api Group 中间件失败了....\n")
		context.Abort()
	})

	group.Use()

	//这个回调不会执行
	group.GET("/hello/:name", func(context *Context) {
		name := context.Params.ByName("name")
		context.String(http.StatusOK, path.Join("hello ", name, "!"))
	})

	//测试没有发生Abort
	group2 := r.Group("/api2", func(context *Context) {
		//todo....
		context.String(http.StatusOK, "api Group 中间件成功了....\n")
	})

	//这个回调会执行
	group2.GET("/hello2/:name", func(context *Context) {
		name := context.Params.ByName("name")
		context.String(http.StatusOK, path.Join("hello2 ", name, "!\n"))
	})

	// 启动服务器并监听端口
	r.Run(":8088")
}
启动测试
go test
curl请求测试
curl -i http://localhost:8088/api2/hello2/scott
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 30 Jan 2024 06:56:03 GMT
Content-Length: 49

api Group 中间件成功了....
hello2 /scott/!
➜  ~ curl -i http://localhost:8088/api/hello/scott
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 30 Jan 2024 06:56:26 GMT
Content-Length: 33

api Group 中间件失败了....
查看控制台输出

标签:case,return,func,中间件,Mygin,context,http,logger
From: https://www.cnblogs.com/pengb/p/17997152

相关文章

  • Mygin中间件优化及sync.Pool上下文复用
    本篇是mygin的第六篇,参照gin框架,感兴趣的可以从Mygin第一篇开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现。目的中间件Middleware优化默认log日志中间件在上篇Mygin实现中间件Middleware中间件Middleware很生硬,完全依赖循环,如果某个中间件想要c......
  • 无涯教程-ExpressJS - 中间件(Middleware)
    中间件(Middleware)函数是可以访问请求对象(requestobject),响应对象(responseobject)以及应用程序的请求(request)-响应(response)中的下一个中间件函数。这些函数用于修改req和res对象,以执行诸如解析请求正文(responstbodies),添加响应标头(responseheaders)等任务。这......
  • 专栏:数据库、中间件的监控一网打尽
    前言对于数据库、中间件的监控,目前社区里最为完善的就是Prometheus生态的各个Exporter,不过这些Exporter比较分散,不好管理,如果有很多目标实例需要监控,就要部署很多个Exporter,要是能有一个大一统的Exporter,具备所有这些Exporter的能力就好了。还真有,而且还不止一个,一个是 G......
  • 专栏:数据库、中间件的监控一网打尽
    前言对于数据库、中间件的监控,目前社区里最为完善的就是Prometheus生态的各个Exporter,不过这些Exporter比较分散,不好管理,如果有很多目标实例需要监控,就要部署很多个Exporter,要是能有一个大一统的Exporter,具备所有这些Exporter的能力就好了。还真有,而且还不止一个,一个是......
  • go中间件实现登录验证
    一、概述在java中可以使用过滤器、拦截器实现登录验证(验证token的有效性、判断哪些路径需要登录、哪些路径不需要登录)等等的一些公共性的验证操作。go语言中有没有类似的东西呢,答案是有的,go语言中可以使用中间件来完成这个操作。接下来使用gin+中间件的形式来验证t......
  • Mygin实现中间件Middleware
    本篇是mygin的第六篇,参照gin框架,感兴趣的可以从Mygin第一篇开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现。目的实现中间件Middleware在上一篇Mygin实现分组路由Group中,实现了路由分组,且同一分组的执行,会先执行Group,有一点点中间件的雏形了。但......
  • 名词解析——中间件
    操作系统、数据库、中间件号称系统软件三驾马车,其中的中间件是最神秘的。操作系统,如Windows,Linux等等,略有常识的小伙伴都耳熟能详,对于其功能也略知一二,数据库大致也许是一个用来存储数据的仓库。本文我们来简单的说一下中间件关于中间件:中间件是一种独立的系统软件或服务程序,分布......
  • 系统、中间件系统加固
    安全加固与应急响应Linux操作系统加固主要根据六个方面进行系统加固​ 版本升级、关闭端口服务、修改配置项(系统加固主要操作在此)、修改代码、主机和网络的ACL策略、部署设备防护安全加固测试流程回退测试——>业务测试——>有效性测试Linux系统加固实施案例:加固方向:......
  • Mygin实现分组路由Group
    本篇是Mygin第五篇目的实现路由分组为什么要分组分组控制(GroupControl)是Web框架应该提供的基础功能之一,对同一模块功能的开发,应该有相同的前缀。或者对一部分第三方接口,统一需要加解密等功能。分组后很方便。例如:对于任务模块,统一前缀为/task除去/user/login接口,都......
  • Mygin实现动态路由
    本篇是Mygin的第四篇目的使用Trie树实现动态路由解析。参数绑定前缀树本篇比前几篇要复杂一点,原来的路由是用map实现,索引非常高效,但是有一个弊端,键值对的存储的方式,只能用来索引静态路由。遇到类似hello/:name这动态路由就无能为力了,实现动态路由最常用的数据结构,被称为......