2016-08-19 3 views
4

私はhttp apiのプロジェクトに取り組んでいます。実装したいことがありますが、私はそれを行う方法を見つけていません。 私のケースでは、トランザクションIDをリクエストで送信します。このトランザクションIDを取得してロガーで使用し、現在のリクエストの各ログエントリにこの情報を追加します。私はいくつかの問題が発生した場合に情報を取得したいときにログのフィルタリングを改善するためにこれを実行したいと思います。Go - リクエストの各メッセージに特定の情報を追加するためにロガーをラップします

例えば私のトランザクション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

ロガーでトランザクションIDの前に接頭辞を付けます。標準的なロガーはそれを行うための多くの方法を提供します。一例はlog.New()メソッドです。

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

GetLoggerは、すべてのログにトランザクションIDの前に付けるロガーを提供します。

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())) 
関連する問題