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. 在腾讯云容器服务 TKE 中利用 HPA 实现业务的弹性伸缩

    在 TKE 上利用 HPA 实现业务的弹性伸缩 概述 Kubernetes Pod 水平自动扩缩(Horizontal Pod Autoscaler,以下简称 HPA)可以基于 CPU 利用率.内存利 ...

  2. 生成微博授权URL及回调地址

    1.创建apps/oauth模块进行oauth认证 '''2.1 在apps文件夹下新建应用: oauth''' cd syl/apps python ../manage.py startapp oa ...

  3. 七. Vue Router详解

    1. 认识路由 1.1 路由概念 路由是什么? 路由是一个网络工程里面的术语. 路由(routing)就是通过互联的网络把信息从源地址传输到目的地址的活动 --- 维基百科 路由器提供了两种机制:路由 ...

  4. python实现自动发邮件

    Python有两个内置库:smtplib和email,可以实现邮件功能,无需下载,直接import导入. smtplib库负责发送邮件 Email库负责构造邮件格式和内容 邮件发送需要遵守SMTP协议 ...

  5. moviepy音视频剪辑:视频剪辑基类VideoClip的__init__构造方法参数has_constant_size的作用

    ☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑模块的视频剪辑基类VideoClip构造方法: __init__(self, make_frame=None, ismask=Fals ...

  6. 什么是Python迭代器?

    迭代器(Iterator):迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个迭代器对象必须是定义了__iter__()方法和next()方法的对象. Pyth ...

  7. Python的富比较方法__eq__和__ne__之间的关联关系分析

    Python的富比较方法包括__lt__.__gt__.__le__.__ge__.__eq__和__ne__六个方法,分别表示:小于.大于.小于等于.大于等于.等于和不等于,对应的操作运算符为:&l ...

  8. Python模块是否支持自定义属性使用双下划线开头和结尾?

    我们知道在Python中,变量名类似__xxx__的,也就是以双下划线开头并且以双下划线结尾的变量和方法,是特殊变量,特殊变量是可以直接访问的,不是私有变量,所以,一般实例变量和类变量以及方法不能用_ ...

  9. 转2:Python字符编码详解

    1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...

  10. Google浏览器PostMan插件版安装步骤

    PostMan插件版安装步骤: 第一步:把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar 第二步:右键点击该文件,并使用压缩软件(如winrar.360压缩等)对该压 ...