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 }