• 学习 Gin 总结(2020.12.30-31)


    2020.12.30 问题总结

    中间件

    context.Next()

    源码注释:

    // Next should be used only inside middleware.
    // It executes the pending handlers in the chain inside the calling handler.
    

    只能在中间件中使用的函数,它在调用处理程序内的链中执行挂起的处理程序。

    也就是暂时会阻塞中间件的执行,去执行处理请求函数。处理完毕请求函数后,再回来执行中间件剩余部分的操作,进行后续处理。

    例子

    // MiddleWare 声明自定义中间件 ,返回一个处理函数
    func MiddleWare() gin.HandlerFunc {
    	//返回一个输出当地时间的处理函数
    	return func(context *gin.Context) {
    		now := time.Now()
    		fmt.Print("请求时间为:")
    		fmt.Println(now)
    		//执行处理函数
    		context.Next()
    		// 处理函数执行完毕后,中间件执行后续部分
    		// Set 放入数据到上下文 context
    		context.Set("time",now)
    	}
    }
    
    // UseMiddleWare 测试使用自定义中间件
    func UseMiddleWare(c *gin.Context)  {
       // Get 拿到中间件放置的数据
       getTime, _ := c.Get("time")
       //返回 JSON
       c.JSON(http.StatusOK,gin.H{"time":getTime})
    }
    

    这里可以简单验证一下,在请求中需要Get到中间件Settime,把Set操作放在context.Next()后,这时候请求处理是Get不到time的。

    正确写法,在context.Next()前执行Set()写入time,这时候处理函数Get才能拿到数据。

    // MiddleWare 声明自定义中间件 ,返回一个处理函数
    func MiddleWare() gin.HandlerFunc {
    	//返回一个输出当地时间的处理函数
    	return func(context *gin.Context) {
    		now := time.Now()
    		// Set 放入数据到上下文 context
    		context.Set("time",now)
    		//执行处理函数
    		context.Next()
    		// 处理函数执行完毕后,中间件执行后续部分
    		fmt.Print("请求时间为:")
    		fmt.Println(now)
    	}
    }
    

    2020.12.31 问题总结

    记录日志

    文件或控制台形式写入

    // Logging 记录日志处理方法
    // 记录日志并持久化到磁盘
    // @fileName 文件路径+文件名,不填写路径,则以文件名保存在工程文件根目录下
    func Logging(fileName string) {
    	//		采用模式0666(任何人都可读写,不可执行)
    	file, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
    	if err != nil {
    		fmt.Println("创建日志文件出错,err :", err)
    	}
    	//同时将日志写入文件和控制台,参数可选:支持文件+控制台,控制台,文件 三种
    	gin.DefaultWriter = io.MultiWriter(file, os.Stdout)
    }
    

    上面方法并不能记录运行日志,只能记录启动日志。

    因此下面改用Logru进行记录运行日志。

    使用 Logrus

    GitHub 上一个开源的日志记录项目( github.com/sirupsen/logrus )

    这次采用注册全局中间件的方式,进行整个程序的日志记录。

    // LogrusLog 注册该中间件,使用 Logrus 记录日志并进行持久化,保存到磁盘
    func LogrusLog() gin.HandlerFunc {
    	//创建文件进行日志文件的持久化
    	file, err := os.OpenFile("Logrus.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666)
    	if err != nil {
    		fmt.Println("创建日志文件出错,err :", err)
    	}
    	//创建一个日志记录实例
    	logger := logrus.New()
    	// 输出设置
    	logger.Out = file
    	//设置日志级别
    	logger.SetLevel(logrus.DebugLevel)
    	//设置日志格式
    	logger.SetFormatter(&logrus.TextFormatter{})
    	return func(c *gin.Context) {
    		// 开始时间
    		startTime := time.Now()
    		// 处理请求
    		c.Next()
    		// 结束时间
    		endTime := time.Now()
    		// 执行时间
    		latencyTime := endTime.Sub(startTime)
    		// 请求方式
    		reqMethod := c.Request.Method
    		// 请求路由
    		reqUri := c.Request.RequestURI
    		// 状态码
    		statusCode := c.Writer.Status()
    		// 请求IP
    		clientIP := c.ClientIP()
    		// 日志格式
    		logger.Infof("| %3d | %13v | %15s | %s | %s |",
    			statusCode,
    			latencyTime,
    			clientIP,
    			reqMethod,
    			reqUri,
    		)
    	}
    }
    

    这时候,有启动日志运行日志都在不同的文件记录下来,在相应的文件上就可以查看相关的记录,进行系统的运行监控。

  • 相关阅读:
    POJ 3356 水LCS
    POJ 2250 (LCS,经典输出LCS序列 dfs)
    POJ 1080( LCS变形)
    整数划分问题之最大乘积
    进程调度之FCFS算法(先来先运行算法)
    c模拟银行家资源分配算法
    c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)
    HDU 2602 Bone Collector(经典01背包问题)
    NYOJ 44 字串和 (最大字串和 线性dp)
    匈牙利游戏(codevs 1269)
  • 原文地址:https://www.cnblogs.com/l1ng14/p/14217736.html
Copyright © 2020-2023  润新知