• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

gin研发----间件

武飞扬头像
空心树无芽
帮助2

在gin的框架中,中间件绑定在路由环节,常规的使用方式如下:

middlewares/auth.go

  1.  
    package middlewares
  2.  
     
  3.  
    import (
  4.  
    "github.com/gin-gonic/gin"
  5.  
    "net/http"
  6.  
    )
  7.  
     
  8.  
    func Auth() gin.HandlerFunc {
  9.  
    return func(c *gin.Context) {
  10.  
    token, _ := c.GetQuery("token")
  11.  
    if token == "" {
  12.  
    c.JSON(http.StatusForbidden, gin.H{"code":50008, "message":"非法访问!"})
  13.  
    c.Abort()
  14.  
    }
  15.  
    c.Next()
  16.  
    }
  17.  
    }
学新通

router.go

  1.  
    package routers
  2.  
     
  3.  
    import (
  4.  
    "gin/controllers"
  5.  
    "gin/middlewares"
  6.  
    "github.com/gin-gonic/gin"
  7.  
    )
  8.  
     
  9.  
    func InitRouter() *gin.Engine {
  10.  
    router := gin.Default()
  11.  
    router.Use(
  12.  
    middlewares.Cors(), //跨域中间件
  13.  
    middlewares.Auth(), //鉴权中间件
  14.  
    )
  15.  
     
  16.  
    uploadGroup := router.Group("/upload")
  17.  
    {
  18.  
    uploadGroup.POST("/upload", controllers.Upload)
  19.  
    }
  20.  
     
  21.  
    return router
  22.  
    }
学新通

=========================================================================

下面重点讲解下日志中间件,因为需要是从PHP转过来的老程序员,所以对PHP框架中的日志存储方式情有独钟,而gin原生的log是存储在一个文件内,很不习惯,因此,找到一个能够按照时间分割日志的包才安心。

1、将下面三个包拉到项目中

  1.  
    go get "github.com/lestrrat/go-file-rotatelogs"
  2.  
    go get "github.com/rifflock/lfshook"
  3.  
    go get "github.com/sirupsen/logrus"

2、中间件编写

  1.  
    package middlewares
  2.  
     
  3.  
    import (
  4.  
    "fmt"
  5.  
    "github.com/gin-gonic/gin"
  6.  
    rotatelogs "github.com/lestrrat/go-file-rotatelogs"
  7.  
    "github.com/rifflock/lfshook"
  8.  
    "github.com/sirupsen/logrus"
  9.  
    "os"
  10.  
    "time"
  11.  
    )
  12.  
     
  13.  
    func Logger() gin.HandlerFunc {
  14.  
    logClient := logrus.New()
  15.  
     
  16.  
    //禁止logrus输出
  17.  
    src, err := os.OpenFile(os.DevNull, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
  18.  
    if err != nil {
  19.  
    fmt.Println("err", err)
  20.  
    }
  21.  
    logClient.Out = src
  22.  
    logClient.SetLevel(logrus.DebugLevel)
  23.  
    apiLogPath := "logs/access.log"
  24.  
    logWriter, err := rotatelogs.New(
  25.  
    apiLogPath ".%Y%m%d-%H%M.log",
  26.  
    rotatelogs.WithLinkName(apiLogPath), //生成软连接,指向新的日志文件
  27.  
    rotatelogs.WithMaxAge(7*24*time.Hour), //文件最大保存时间
  28.  
    rotatelogs.WithRotationTime(24*time.Hour), //日志切割时间间隔
  29.  
    )
  30.  
    writeMap := lfshook.WriterMap{
  31.  
    logrus.InfoLevel: logWriter,
  32.  
    logrus.FatalLevel:logWriter,
  33.  
    }
  34.  
    lfHook := lfshook.NewHook(writeMap, &logrus.JSONFormatter{})
  35.  
    logClient.AddHook(lfHook)
  36.  
     
  37.  
    return func(c *gin.Context) {
  38.  
    //开始时间
  39.  
    start := time.Now()
  40.  
     
  41.  
    //执行逻辑
  42.  
    c.Next()
  43.  
     
  44.  
    //结束时间
  45.  
    end := time.Now()
  46.  
     
  47.  
    //执行时间
  48.  
    execTime := end.Sub(start)
  49.  
     
  50.  
    path := c.Request.URL.Path //请求路径
  51.  
    clientIP := c.ClientIP() //请求IP
  52.  
    method := c.Request.Method //请求方式
  53.  
    statusCode := c.Writer.Status() //请求状态
  54.  
     
  55.  
    logClient.Infof("|= | v | s | %s %s |",
  56.  
    statusCode,
  57.  
    execTime,
  58.  
    clientIP,
  59.  
    method,
  60.  
    path,
  61.  
    )
  62.  
    }
  63.  
    }
学新通

上图中,最不可忽略的当属 c.next() ,表示载入后续的逻辑代码执行,执行结束后继续此中间件的后续部分。

这个方式,让我想起了TP5中的钩子。

3、创建日志目录

在根目录创建logs,否则会因为路径不存在报错,当然加一个目录判断会是种不错的选择。

4、修改路由器

  1.  
    package routers
  2.  
     
  3.  
    import (
  4.  
    "gin/controllers"
  5.  
    "gin/middlewares"
  6.  
    "github.com/gin-gonic/gin"
  7.  
    )
  8.  
     
  9.  
    func InitRouter() *gin.Engine {
  10.  
    router := gin.Default()
  11.  
    router.Use(
  12.  
    middlewares.Cors(), //跨域中间件
  13.  
    middlewares.Auth(), //鉴权中间件
  14.  
    middlewares.Logger(), //日志中间件
  15.  
    )
  16.  
     
  17.  
    uploadGroup := router.Group("/upload")
  18.  
    {
  19.  
    uploadGroup.POST("/upload", controllers.Upload)
  20.  
    }
  21.  
     
  22.  
    return router
  23.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiafbec
系列文章
更多 icon
同类精品
更多 icon
继续加载