在实际的业务中,我们的服务端可能需要记录下所有客户端的请求信息,包括不仅限于:
请求的url 强求的method 请求的header头 请求的paras参数 请求的ip 请求的好使 等等信息
那么这里在go语言里面怎么做呢?
这里的话其实就是使用中间件来完成。
在Echo框架里面,会涉及到两种中间件,一种是pre,也就是在请求之前进行拦截,另外一种use中间件,代表的是在http执行之后的拦截,本文我们演示的是使用Echo框架的use中间件来完成每一个客户端请求日志的打印。这块其实添加起来比较简单,我们只需要添加一个use的func即可,示例如下:
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc { return func(ctx echo.Context) error { startTime := time.Now() //执行action业务逻辑 if err := next(ctx); err != nil { logger.Error("用户访问日志, action返回错误", zap.Error(err)) } //请求耗时 duration := time.Since(startTime) formParams, _ := ctx.FormParams() // logger.Info("用户访问日志", zap.String("uri", ctx.Request().URL.Path), zap.Any("method", ctx.Request().Method), zap.Any("queryParaList", ctx.QueryParams()), zap.Any("formParaList", formParams), zap.Any("header", ctx.Request().Header), zap.Any("userAgent", ctx.Request().UserAgent()), zap.Any("cookies", ctx.Request().Cookies()), zap.String("ip", ctx.RealIP()), zap.Any("ipLocation", ip_location.GetIpLocationString(ctx.RealIP())), zap.Any("输入字节数", ctx.Request().Header.Get(echo.HeaderContentLength)), zap.Any("响应字节数", ctx.Response().Size), zap.Any("duration", duration), zap.Any("durationNanosecond", int64(duration))) logger.Info("用户访问日志", zap.String("uri", ctx.Request().URL.Path), zap.Any("method", ctx.Request().Method), zap.Any("queryParaList", ctx.QueryParams()), zap.Any("formParaList", formParams), zap.Any("header", ctx.Request().Header), zap.Any("userAgent", ctx.Request().UserAgent()), zap.Any("cookies", ctx.Request().Cookies()), zap.String("ip", ctx.RealIP()), zap.Any("输入字节数", ctx.Request().Header.Get(echo.HeaderContentLength)), zap.Any("响应字节数", ctx.Response().Size), zap.Any("duration", duration), zap.Any("durationNanosecond", int64(duration))) return nil } })
也就是在echo示例启动之前,我们添加上面的use中间件的func,即可完成日志拦截的添加,我们来运行一下:
可以看到这里我们市县了打印上面这些指标的案例,打印出来的示例如下:
{"level":"info","ts":1687760172.326241,"caller":"demo1/main.go:52","msg":"用户访问日志","uri":"/getuser1","method":"GET","queryParaList":{},"formParaList":{},"header":{"Accept":["*/*"],"User-Agent":["curl/7.29.0"]},"userAgent":"curl/7.29.0","cookies":[],"ip":"192.168.31.218","输入字节数":"","响应字节数":0,"duration":0,"durationNanosecond":0}
这里打印所有请求一般在业务中属于一个硬性的要求,所以大家可以直接参考这篇文章即可。
最后按照惯例,附上本案例的源码,登录后即可查看。
还没有评论,来说两句吧...