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

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

学习 Gin 总结(2020.12.30-31)的更多相关文章

  1. 学习 Gin 问题总结 2020.12.29

    学习 Gin 问题总结 2020.12.29 数据绑定与解析 BindXXX,ShouldBindXXX和ShouldBindWith区别 BindXXX 会自动返回信息,输入无效时,在header写 ...

  2. OCM 12c | OCM 12c Update | OCM 11g (Retiring Dec 31, 2019) | OCM 11g考试延期至2020.04.30

     OCM 全球考试安排时间表 View A Worldwide OCM Schedule Oracle Database 12c Certified Master Exam (OCM) OCM 12c ...

  3. 2015.12.29~2015.12.30真题回顾!-- HTML5学堂

    2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停 ...

  4. Qt 学习之路 2(30):Graphics View Framework

    Qt 学习之路 2(30):Graphics View Framework 豆子 2012年12月11日 Qt 学习之路 2 27条评论 Graphics View 提供了一种接口,用于管理大量自定义 ...

  5. js 中日期2013-08-30或2019-08-24 12:30:00 转换成时间戳,和2019-08-29T02:15:08.000+0000转化为2019-08-29T02:15:08

    js 中日期2019-08-24 或2019-08-24 12:30:00 转换成时间戳 首先将它转成date日期类型,然后获取毫秒形式时间戳 let date=new Date("2019 ...

  6. 2018.12.30【NOIP提高组】模拟赛C组总结

    2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...

  7. 2020.12.14vj补题

    A. Lucky Ticket 题意:就是说4与7是幸运数字,用4和7组成的数字也是幸运数字,问所给数字是不是幸运数字 思路:直接敲 代码: 1 #include<iostream> 2 ...

  8. 2016年12月31日 星期六 --出埃及记 Exodus 21:26

    2016年12月31日 星期六 --出埃及记 Exodus 21:26 "If a man hits a manservant or maidservant in the eye and d ...

  9. Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50

    Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50 分类: 系统运维 查找包含BOM头的文件,命令如下: 点击(此处)折叠或打开 grep -r -I -l ...

随机推荐

  1. python 网络并发 :理论部分

    1.今日内容大纲 进程的介绍(理论部分) 进程的创建以及分析 获取进程的pid 进程之间的隔离 1.进程的介绍(理论部分) 1.1什么是进程 一个正在被cpu执行的程序就是一个进程,一个程序可以开启多 ...

  2. 从使用传统Web框架到切换到Spring Boot后的总结

    1.前言 其实我接触 Spring Boot 的时间并不长,所以还算一个初学者,这篇文章也算是我对 Spring Boot 学习以及使用过程中的复盘,如果文章出现描述错误或表达不清晰的地方,欢迎大家在 ...

  3. MacOS JMeter安装(多图)

    本文基于 MacOS 环境下进行 Jmeter 的安装. 一.下载JMeter 本文选用 JMeter 5.3 版本安装,5.3 版本需要 JDK 1.8 + 版本环境. Jmeter 5.3 下载: ...

  4. 第4.4节 Python解析与推导:列表解析、字典解析、集合解析

    一.    引言 经过前几个章节的介绍,终于把与列表解析的前置内容介绍完了,本节老猿将列表解析.字典解析.集合解析进行统一的介绍. 前面章节老猿好几次说到了要介绍列表解析,但老猿认为涉及知识层面比较多 ...

  5. PyQt(Python+Qt)学习随笔: QAbstractItemView的dragDropMode属性

    老猿Python博文目录 老猿Python博客地址 一.概述 dragDropMode属性用于控制视图拖放事件的处理方式,其类型为枚举类型DragDropMode. 二.枚举类型DragDropMod ...

  6. PyQt(Python+Qt)学习随笔:在一个窗口点击按钮弹出另一个窗口的实现方法及注意事项

    在Qt Designer中定义了两个窗口,一个主窗口一个弹出窗口,需要实现在主窗口点击一个按钮时弹出弹出窗口. 经老猿验证: 1.弹窗的窗口类型无特殊要求,只要是QWidget等窗口部件就可以,也可以 ...

  7. 笔记-Cats Transport<已写题解>

    笔记-Cats Transport Cats Transport 令 \(D_i=\sum_{j=1}^id_i\),\(T_i=t_i-D_{h_i}\). 为 \(T_i\) 从小到大排序,令 \ ...

  8. 第二章、 Centos 6.8安装 Docker

    2.1检查Docker的先决条件 64位 CPU计算机(x86_64),不支持32位 CPU 运行Linux 3.8 或更高版本内核. 内核必须支持一种合适的存储驱动(storage driver), ...

  9. ajax与浏览器请求的差异对比.png

  10. VirtualBox5.2.2 安装 CentOS 7

    转自百度经验:https://jingyan.baidu.com/article/4dc4084868a1e4c8d946f133.html?tdsourcetag=s_pctim_aiomsg&am ...