概念
在翻阅Gin的使用资料时,总能看到“中间件”这个概念,中间件是什么?
在Go中,中间件是指在web服务中,对请求的预处理和后置处理;被称为“中间件”,是因为它位于 Go 网络服务器和实际处理程序之间。
中间件的作用
如果想在每次请求前后执行一些代码,例如,如果想记录对服务器发出的所有请求,或者允许所有 API 都可以跨源调用,或者确保当前用户在调用安全资源的处理程序之前已经过身份验证...这些都可以用中间件完成。
中间件不是Gin特有的概念,而是Go web服务的概念。
Gin中的中间件
Gin中使用中间件:router.Use(...)
Recovery
Recovery的作用是可以在任何panic中恢复过来并返回500。
// Recovery returns a middleware that recovers from any panics and writes a 500 if there was one.
func Recovery() HandlerFunc {
return RecoveryWithWriter(DefaultErrorWriter)
}
也就是说,当程序里有些异常情况没考虑到的时候,程序就panic退出了,服务就会停止,用了recovery中间件,遇到panic服务也不会退出,而是返回500;
Gin默认的启动方式是r := gin.Default()
其中包含 Logger、Recovery 中间件
如果想自己添加的话,也可以这样:router.Use(gin.Recovery())
;
Logger
顾名思义,记录日志的中间件; 处理请求时,会看到有日志打印到控制台;
Logger 中间件将日志写入 gin.DefaultWriter,默认的gin.DefaultWriter = os.Stdout
将日志记录到文件
// 禁用控制台颜色,将日志写入文件时不需要控制台颜色。
gin.DisableConsoleColor()
// 创建日志文件
f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f)
router := gin.Default()
如果需要同时将日志写入文件和控制台,需要这样写:
gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
自定义日志的格式
根据Default()的代码可以知道,这里的日志分两部分:debugPrintWARNINGDefault()
和中间件Logger()
;
按照我的理解,debugPrintWARNINGDefault 是服务启动时的日志;Logger()记录客户端对服务器发送的每一次请求;
- 修改
debugPrintWARNINGDefault()
的格式:
router := gin.Default()
gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) {
log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers)
}
- 修改访问日志 需要创建一个不包含中间件的路由
router := gin.New()
- 再添加自定义的日志中间件
router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
// 自定义格式
return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
param.ClientIP,
param.TimeStamp.Format(time.RFC1123),
param.Method,
param.Path,
param.Request.Proto,
param.StatusCode,
param.Latency,
param.Request.UserAgent(),
param.ErrorMessage,
)
}))
以上就是中间件的简单了解,期待下次相遇。