1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- package logger
- import (
- "fmt"
- "io"
- "net/http"
- "strconv"
- "strings"
- "time"
- )
- type handler struct {
- h http.Handler
- w io.Writer
- c chan logMsg
- }
- func (this handler) log(w *writer, r *http.Request) {
- rip := r.RemoteAddr
- if r.Header.Get("X-Real-IP") != "" && len(r.Header.Get("X-Real-IP")) <= 25 {
- rip = rip + ", " + strings.TrimSpace(r.Header.Get("X-Real-IP"))
- } else if r.Header.Get("X-Forwarded-For") != "" && len(r.Header.Get("X-Forwarded-For")) <= 25 {
- rip = rip + ", " + strings.TrimSpace(r.Header.Get("X-Forwarded-For"))
- }
- uagent := "-"
- if r.Header.Get("User-Agent") != "" && len(r.Header.Get("User-Agent")) <= 256 {
- uagent = strings.TrimSpace(r.Header.Get("User-Agent"))
- }
- msg := fmt.Sprint(strings.Join([]string{
- r.Host,
- "(" + rip + ")",
- "[" + w.s.Format(time.RFC3339) + "]",
- `"` + r.Method,
- r.RequestURI,
- r.Proto + `"`,
- strconv.Itoa(w.status),
- strconv.Itoa(w.size),
- fmt.Sprintf("%.3f ms", time.Now().Sub(w.s).Seconds()),
- `"` + uagent + `"`,
- }, " "))
- select {
- case <-r.Context().Done():
- return
- case this.c <- logMsg{r.Host, msg, w.status >= 400}:
- return
- case <-time.After(1 * time.Second):
- fmt.Printf("Logger, can't write msg (overflow): %s\n", msg)
- return
- }
- }
- func (this handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- wrt := &writer{w: w, s: time.Now()}
- this.h.ServeHTTP(wrt, r)
- this.log(wrt, r)
- }
|