2016-08-19 1 views
4

Я работаю над проектом http api, и есть вещь, которую я хочу реализовать, но я не нашел способ сделать это , Итак, в моем случае я отправляю запрос идентификатор транзакции, а тонкий, который я хочу сделать, - это получить этот идентификатор транзакции и использовать его в журнале регистрации, добавить эту информацию в каждую запись журнала текущего запроса. Я хочу сделать это, чтобы лучше фильтровать мои журналы, когда я хочу получать информацию, если возникает какая-то проблема.Go - обернуть регистратор, чтобы добавить определенную информацию в каждое сообщение запроса

Например мой идентификатор транзакции 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" Это вид информации, которую я хочу, чтобы в моих журналах.

Таким образом, вместо того, чтобы вводить идентификатор транзакции в каждый вызов журнала, мне было интересно, есть ли способ использовать регистратор в качестве одноэлементного устройства и добавлять информацию каждый раз, когда вызывается журнал.

Надеюсь, я предоставил достаточно подробностей в этом выпуске.

спасибо.

ответ

2

Префикс идентификатора транзакции в регистраторе. Стандартный gologger предоставляет множество способов сделать это. Примером может служить метод log.New().

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

GetLogger предоставит вам регистратор, который будет префикс вашего идентификатора транзакции в каждом журнале.

0

вот решение logrus, скопированное с my answer here, положите это на вершину своей цепи промежуточного программного обеспечения и обновите поля, чтобы захватить 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())) 
Смежные вопросы