Go - Wrap记录器,以便在请求的每条消息中添加特定信息



我正在一个http api的项目上工作,有一件事我想实现,但我还没有找到方法。因此,在我的示例中,我向请求发送一个事务id,我想要做的是获取这个事务id并在日志记录器中使用它,在当前请求的每个日志条目中添加此信息。我想这样做是为了更好地过滤我的日志,当我想检索信息,如果一些问题发生。

例如,我的事务id是foo: api | [GIN] 2016/08/19 - 13:00:37 | 201 | 30.791855ms | 192.168.99.1:63922 | POST /v1/my/endpoint api | time="2016-08-19T13:00:39Z" level=info msg="Authenticated API user: tests" transactionId="foo" api | time="2016-08-19T13:00:39Z" level=debug msg="SQL query" args=25 query=" SELECT id, created, information1, information2 FROM mydb.mytable WHERE id = ?; " transactionId="foo" 这就是我想在日志中记录的信息。

因此,在每个日志调用中注入事务id,我想知道是否有一种方法可以将日志记录器作为单例使用,并在每次调用日志记录器时添加信息。

我希望我在这个问题上提供了足够的细节。

谢谢。

为日志记录器中的事务id添加前缀。标准go记录器提供了许多方法来实现它。log.New()方法就是一个例子。

func GetLogger(transactionID string) *log.Logger {
    return log.New(os.Stdout, fmt.Sprintf("[transactionId = %s ] ", transactionID),
         log.Lshortfile)
}

GetLogger将为您提供一个记录器,它将在每个日志中为您的transactionID添加前缀。

这是从我这里的答案复制的logus解决方案,将其放在中间件链的顶部,并更新字段以获取请求的txid。

func Logrus(logger *logrus.Logger) gin.HandlerFunc {
    return func(c *gin.Context) {
        start := time.Now().UTC()
        path := c.Request.URL.Path
        c.Next()
        end := time.Now().UTC()
        latency := end.Sub(start)
        logger.WithFields(logrus.Fields{
            "status":     c.Writer.Status(),
            "method":     c.Request.Method,
            "path":       path,
            "ip":         c.ClientIP(),
            "duration":   latency,
            "user_agent": c.Request.UserAgent(),
        }).Info()
    }
}
GinEngine.Use(Logger(logrus.StandardLogger()))

最新更新