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

时间:2016-08-19 15:46:45

标签: logging go wrapping

我正在研究一个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,我想知道是否有办法将记录器用作单例并在每次调用记录器时添加信息。

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

感谢。

2 个答案:

答案 0 :(得分:2)

在记录器中添加您的交易ID。标准记录器提供了许多方法。一个例子是log.New()方法。

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

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

答案 1 :(得分:0)

这是从my answer here复制的logrus解决方案,将其置于中间件链的顶部,并更新字段以获取请求的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()))