code.gitea.io/gitea@v1.19.3/modules/context/access_log.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package context
     5  
     6  import (
     7  	"bytes"
     8  	"context"
     9  	"net/http"
    10  	"text/template"
    11  	"time"
    12  
    13  	"code.gitea.io/gitea/modules/log"
    14  	"code.gitea.io/gitea/modules/setting"
    15  )
    16  
    17  type routerLoggerOptions struct {
    18  	req            *http.Request
    19  	Identity       *string
    20  	Start          *time.Time
    21  	ResponseWriter http.ResponseWriter
    22  	Ctx            map[string]interface{}
    23  }
    24  
    25  var signedUserNameStringPointerKey interface{} = "signedUserNameStringPointerKey"
    26  
    27  // AccessLogger returns a middleware to log access logger
    28  func AccessLogger() func(http.Handler) http.Handler {
    29  	logger := log.GetLogger("access")
    30  	logTemplate, _ := template.New("log").Parse(setting.Log.AccessLogTemplate)
    31  	return func(next http.Handler) http.Handler {
    32  		return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
    33  			start := time.Now()
    34  			identity := "-"
    35  			r := req.WithContext(context.WithValue(req.Context(), signedUserNameStringPointerKey, &identity))
    36  
    37  			next.ServeHTTP(w, r)
    38  			rw := w.(ResponseWriter)
    39  
    40  			buf := bytes.NewBuffer([]byte{})
    41  			err := logTemplate.Execute(buf, routerLoggerOptions{
    42  				req:            req,
    43  				Identity:       &identity,
    44  				Start:          &start,
    45  				ResponseWriter: rw,
    46  				Ctx: map[string]interface{}{
    47  					"RemoteAddr": req.RemoteAddr,
    48  					"Req":        req,
    49  				},
    50  			})
    51  			if err != nil {
    52  				log.Error("Could not set up chi access logger: %v", err.Error())
    53  			}
    54  
    55  			err = logger.SendLog(log.INFO, "", "", 0, buf.String(), "")
    56  			if err != nil {
    57  				log.Error("Could not set up chi access logger: %v", err.Error())
    58  			}
    59  		})
    60  	}
    61  }