Files
openaccounting-server/core/api/logger.go
2020-01-15 12:06:56 -05:00

98 lines
1.9 KiB
Go

package api
import (
"github.com/ant0ine/go-json-rest/rest"
"github.com/openaccounting/oa-server/core/model/types"
"log"
"net"
"os"
"strconv"
"time"
)
type LoggerMiddleware struct {
Logger *log.Logger
}
func (mw *LoggerMiddleware) MiddlewareFunc(h rest.HandlerFunc) rest.HandlerFunc {
// set the default Logger
if mw.Logger == nil {
mw.Logger = log.New(os.Stderr, "", 0)
}
return func(w rest.ResponseWriter, r *rest.Request) {
h(w, r)
message := getIp(r)
message = message + " " + getUser(r)
message = message + " " + getTime(r)
message = message + " " + getRequest(r)
message = message + " " + getStatus(r)
message = message + " " + getBytes(r)
message = message + " " + getUserAgent(r)
message = message + " " + getElapsedTime(r)
mw.Logger.Print(message)
}
}
func getIp(r *rest.Request) string {
remoteAddr := r.RemoteAddr
if remoteAddr != "" {
if ip, _, err := net.SplitHostPort(remoteAddr); err == nil {
return ip
}
}
return ""
}
func getUser(r *rest.Request) string {
if r.Env["USER"] != nil {
user := r.Env["USER"].(*types.User)
return user.Email
}
return "-"
}
func getTime(r *rest.Request) string {
if r.Env["START_TIME"] != nil {
return r.Env["START_TIME"].(*time.Time).Format("02/Jan/2006:15:04:05 -0700")
}
return "-"
}
func getElapsedTime(r *rest.Request) string {
if r.Env["ELAPSED_TIME"] != nil {
return r.Env["ELAPSED_TIME"].(*time.Duration).String()
}
return "-"
}
func getRequest(r *rest.Request) string {
return r.Method + " " + r.URL.RequestURI()
}
func getStatus(r *rest.Request) string {
if r.Env["STATUS_CODE"] != nil {
return strconv.Itoa(r.Env["STATUS_CODE"].(int))
}
return "-"
}
func getBytes(r *rest.Request) string {
if r.Env["BYTES_WRITTEN"] != nil {
return strconv.FormatInt(r.Env["BYTES_WRITTEN"].(int64), 10)
}
return "-"
}
func getUserAgent(r *rest.Request) string {
if r.UserAgent() != "" {
return r.UserAgent()
}
return "-"
}