学习 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到中间件Set的time,把Set操作放在context.Next()后,这时候请求处理是Get不到time的。

学习 Gin 总结(2020.12.30-31)

正确写法,在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) } }

学习 Gin 总结(2020.12.30-31)

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, ) } }

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzzxf.html