go-admin框架分析(3—2)—日志系统使用正确方式

前面一篇已经把日志系统给讲明白了,我之前直接调用logger.Info(name)去记录日志,这样看确实也能记录到日志,但是存在两个问题:

  1. 同一次请求的x-request-id会不相同,因为使用的是不同的日志对象
  2. 程序启动后的首次请求会可能记录的日志不全。

那么正确的日志记录方式是:

log, ok:=c.Get(pkg.LoggerKey).(*logger.Helper)

然后用这个log记录

或者使用官方的方法:

type SysApi struct {
	api.Api
}

func (e SysApi) HealthGetv1(c *gin.Context) {
	name := c.DefaultQuery("name", "默认值")
	e.MakeContext(c)
	e.Logger.Info(name)
	c.JSON(200, gin.H{"version": "v1"})
}

MakeContext(c)是将几个对象传递给e SysApi对象,这样使用的就是同一个logger对象了。官方的方法包含了第一种方法的内容。

它记录的日志是这样的:

2022-02-27 18:05:42.604+0800 file:apis/health.go:29 level:info x-request-id:d33bcc70-beb5-4230-b7e9-e7d08c45f2b1 默认值
2022-02-27 18:05:42.605+0800 file:middleware/logger.go:90 latencyTime:666.6µs level:info method:GET statusCode:200 uri:/v1/health x-request-id:d33bcc70-beb5-4230-b7e9-e7d08c45f2b1 

一次请求为什么会有两条记录呢?
因为我们主动调用了一次日志记录,后面这条是框架被动记录的,他记录的是整个http请求的信息。
可以发现,第一条记录不包含latencyTime这个指标,因为它是过程中的记录,这个是记录请求所使用的时间,只有系统被动记录的http请求才包含这个指标,他的实现在r.Use(LoggerToFile())这个中间件里。

你可能感兴趣的:(go,golang,go-admin,logger)