fix: %{status} for request logging
This commit is contained in:
parent
b3a7f1d557
commit
d3e159c770
@ -44,7 +44,7 @@ func NewHandler(
|
|||||||
|
|
||||||
r.HandleFunc("/health", RequestLogHandlerFunc(healthHandler, server))
|
r.HandleFunc("/health", RequestLogHandlerFunc(healthHandler, server))
|
||||||
r.PathPrefix("/static").Handler(RequestLogHandler(static, server))
|
r.PathPrefix("/static").Handler(RequestLogHandler(static, server))
|
||||||
r.NotFoundHandler = index
|
r.NotFoundHandler = RequestLogHandler(index, server)
|
||||||
|
|
||||||
api := r.PathPrefix("/api").Subrouter()
|
api := r.PathPrefix("/api").Subrouter()
|
||||||
|
|
||||||
|
|||||||
@ -55,23 +55,6 @@ func (r *RequestLog) time_string() string {
|
|||||||
return r.time.Format(time.RFC3339)
|
return r.time.Format(time.RFC3339)
|
||||||
}
|
}
|
||||||
|
|
||||||
func logRequest(w http.ResponseWriter, r *http.Request, format string, log_ RequestLog) {
|
|
||||||
if log_.status == 0 {
|
|
||||||
log_.status = 200
|
|
||||||
}
|
|
||||||
log_.ip = realip.FromRequest(r)
|
|
||||||
log_.time = time.Now()
|
|
||||||
log_.request_size = getRequestSize(r)
|
|
||||||
if log_.response_size == 0 {
|
|
||||||
log_.response_size = str2uint64(w.Header().Get("Content-Length"))
|
|
||||||
}
|
|
||||||
log_.origin = r.Header.Get("Origin")
|
|
||||||
log_.referer = r.Header.Get("Referer")
|
|
||||||
log_.path = r.RequestURI
|
|
||||||
log_.method = r.Method
|
|
||||||
log.Println(formatLog(format, log_))
|
|
||||||
}
|
|
||||||
|
|
||||||
// support placeholders:
|
// support placeholders:
|
||||||
//
|
//
|
||||||
// %{user_name}
|
// %{user_name}
|
||||||
@ -132,13 +115,21 @@ func (h *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
h.f(w, r)
|
h.f(w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func handlerfunc2handler(f http.HandlerFunc) http.Handler {
|
func _log(writer *ResponseWriterWrapper, r *http.Request, user *users.User, server *settings.Server) {
|
||||||
return &myHandler{f: f}
|
log_ := RequestLog{
|
||||||
|
user: user,
|
||||||
|
status: writer.GetStatus(),
|
||||||
|
elapsed: writer.GetElapsed(),
|
||||||
|
response_size: writer.GetSize(),
|
||||||
|
ip: realip.FromRequest(r),
|
||||||
|
time: writer.GetTime(),
|
||||||
|
request_size: getRequestSize(r),
|
||||||
|
origin: r.Header.Get("Origin"),
|
||||||
|
referer: r.Header.Get("Referer"),
|
||||||
|
path: r.RequestURI,
|
||||||
|
method: r.Method,
|
||||||
}
|
}
|
||||||
func handler2handlerfunc(h http.Handler) http.HandlerFunc {
|
log.Println(formatLog(server.RequestLogFormat, log_))
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
h.ServeHTTP(w, r)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func RequestLogHandlerFunc(handler http.HandlerFunc, server *settings.Server) http.HandlerFunc {
|
func RequestLogHandlerFunc(handler http.HandlerFunc, server *settings.Server) http.HandlerFunc {
|
||||||
@ -146,15 +137,9 @@ func RequestLogHandlerFunc(handler http.HandlerFunc, server *settings.Server) ht
|
|||||||
return handler
|
return handler
|
||||||
}
|
}
|
||||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
begin := time.Now()
|
|
||||||
writer := MakeResponseWriterWrapper(w)
|
writer := MakeResponseWriterWrapper(w)
|
||||||
handler(writer, r)
|
handler(writer, r)
|
||||||
logRequest(w, r, server.RequestLogFormat, RequestLog{
|
_log(writer, r, nil, server)
|
||||||
user: nil,
|
|
||||||
status: writer.GetStatus(),
|
|
||||||
elapsed: time.Now().Sub(begin).Seconds(),
|
|
||||||
response_size: writer.GetSize(),
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +147,11 @@ func RequestLogHandler(handler http.Handler, server *settings.Server) http.Handl
|
|||||||
if !server.EnableRequestLog {
|
if !server.EnableRequestLog {
|
||||||
return handler
|
return handler
|
||||||
}
|
}
|
||||||
return handlerfunc2handler(RequestLogHandlerFunc(handler2handlerfunc(handler), server))
|
return &myHandler{f: func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
writer := MakeResponseWriterWrapper(w)
|
||||||
|
handler.ServeHTTP(writer, r)
|
||||||
|
_log(writer, r, nil, server)
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
|
|
||||||
func RequestLogHandleFunc(handle handleFunc, server *settings.Server) handleFunc {
|
func RequestLogHandleFunc(handle handleFunc, server *settings.Server) handleFunc {
|
||||||
@ -170,15 +159,10 @@ func RequestLogHandleFunc(handle handleFunc, server *settings.Server) handleFunc
|
|||||||
return handle
|
return handle
|
||||||
}
|
}
|
||||||
return func(w http.ResponseWriter, r *http.Request, d *data) (int, error) {
|
return func(w http.ResponseWriter, r *http.Request, d *data) (int, error) {
|
||||||
begin := time.Now()
|
|
||||||
writer := MakeResponseWriterWrapper(w)
|
writer := MakeResponseWriterWrapper(w)
|
||||||
status, err := handle(writer, r, d)
|
status, err := handle(writer, r, d)
|
||||||
logRequest(w, r, server.RequestLogFormat, RequestLog{
|
writer.status.set(status)
|
||||||
user: d.user,
|
_log(writer, r, nil, server)
|
||||||
status: writer.GetStatus(),
|
|
||||||
elapsed: time.Now().Sub(begin).Seconds(),
|
|
||||||
response_size: writer.GetSize(),
|
|
||||||
})
|
|
||||||
return status, err
|
return status, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package http
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type _size struct {
|
type _size struct {
|
||||||
@ -33,13 +34,15 @@ type ResponseWriterWrapper struct {
|
|||||||
writer http.ResponseWriter
|
writer http.ResponseWriter
|
||||||
size *_size
|
size *_size
|
||||||
status *_status
|
status *_status
|
||||||
|
time time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func MakeResponseWriterWrapper(w http.ResponseWriter) *ResponseWriterWrapper {
|
func MakeResponseWriterWrapper(w http.ResponseWriter) *ResponseWriterWrapper {
|
||||||
return &ResponseWriterWrapper{
|
return &ResponseWriterWrapper{
|
||||||
writer: w,
|
writer: w,
|
||||||
size: &_size{value: 0},
|
size: &_size{value: 0},
|
||||||
status: &_status{value: 0},
|
status: &_status{value: 200},
|
||||||
|
time: time.Now(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,6 +64,14 @@ func (r *ResponseWriterWrapper) GetSize() uint64 {
|
|||||||
return r.size.get()
|
return r.size.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *ResponseWriterWrapper) GetTime() time.Time {
|
||||||
|
return r.time
|
||||||
|
}
|
||||||
|
|
||||||
func (r *ResponseWriterWrapper) GetStatus() int {
|
func (r *ResponseWriterWrapper) GetStatus() int {
|
||||||
return r.status.get()
|
return r.status.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *ResponseWriterWrapper) GetElapsed() float64 {
|
||||||
|
return time.Now().Sub(r.time).Seconds()
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user