我正在一个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()))