github.com/billybanfield/evergreen@v0.0.0-20170525200750-eeee692790f7/apimodels/access_log.go (about)

     1  package apimodels
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"time"
     7  )
     8  
     9  type MyWriter struct {
    10  	under http.ResponseWriter
    11  	code  int
    12  }
    13  
    14  func (self *MyWriter) Header() http.Header {
    15  	return self.under.Header()
    16  }
    17  
    18  func (self *MyWriter) Write(data []byte) (int, error) {
    19  	return self.under.Write(data)
    20  }
    21  
    22  func (self *MyWriter) WriteHeader(code int) {
    23  	self.code = code
    24  	self.under.WriteHeader(code)
    25  }
    26  
    27  type AccessLogger struct {
    28  	router http.Handler
    29  }
    30  
    31  func NewAccessLogger(router http.Handler) *AccessLogger {
    32  	return &AccessLogger{router}
    33  }
    34  
    35  func (self *AccessLogger) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    36  	startTime := time.Now()
    37  	myWriter := &MyWriter{w, 0}
    38  
    39  	self.router.ServeHTTP(myWriter, r)
    40  
    41  	var scheme string
    42  	if r.TLS == nil {
    43  		scheme = "http"
    44  	} else {
    45  		scheme = "https"
    46  	}
    47  	fmt.Printf("access: %v %v %v %v %v %v\n", time.Now(), r.RemoteAddr, r.URL,
    48  		myWriter.code, time.Since(startTime), scheme)
    49  }