Files
2018-04-25 13:16:36 +02:00

152 lines
3.5 KiB
Go

package serverconfig
import (
"encoding/json"
"io"
"strconv"
"time"
"bitbucket.org/nemt/nemt-portal-api/infra/logger"
"github.com/Sirupsen/logrus"
"github.com/labstack/echo"
"github.com/labstack/gommon/log"
)
type echoLogger struct {
*logger.Logger
}
// Printj prints a message in json format
func (l *echoLogger) Printj(data log.JSON) {
bytes, _ := json.Marshal(data)
l.Logger.Print(string(bytes))
}
// Debugj logs a debug message in json format
func (l *echoLogger) Debugj(data log.JSON) {
bytes, _ := json.Marshal(data)
l.Logger.Debug(string(bytes))
}
// Infoj logs an info message in json format
func (l *echoLogger) Infoj(data log.JSON) {
bytes, _ := json.Marshal(data)
l.Logger.Info(string(bytes))
}
// Warnj logs a warning message in json format
func (l *echoLogger) Warnj(data log.JSON) {
bytes, _ := json.Marshal(data)
l.Logger.Warn(string(bytes))
}
// Errorj logs an error message in json format
func (l *echoLogger) Errorj(data log.JSON) {
bytes, _ := json.Marshal(data)
l.Logger.Error(string(bytes))
}
// Panicj logs a panic message in json format
func (l *echoLogger) Panicj(data log.JSON) {
bytes, _ := json.Marshal(data)
l.Logger.Panic(string(bytes))
}
// Fatalj logs a fatal message in json format
func (l *echoLogger) Fatalj(data log.JSON) {
bytes, _ := json.Marshal(data)
l.Logger.Fatal(string(bytes))
}
// Level returns the echo logging level
func (l *echoLogger) Level() log.Lvl {
return log.Lvl(l.Logger.Level)
}
// SetLevel sets the echo logging level
func (l *echoLogger) SetLevel(level log.Lvl) {
l.Logger.Level = logrus.Level(level)
}
// Output returns the echo logging output
func (l *echoLogger) Output() io.Writer {
return l.Writer()
}
// SetOutput sets the echo logging output
func (l *echoLogger) SetOutput(output io.Writer) {
l.Logger.Logger.Out = output
}
// Prefix returns the echo logging output
func (l *echoLogger) Prefix() string {
return l.Logger.Data["app"].(string)
}
// SetPrefix returns the echo logging output
func (l *echoLogger) SetPrefix(prefix string) {
l.Logger.Data["app"] = prefix
}
func loggerMiddlewareHandler(c echo.Context, next echo.HandlerFunc, log *logger.Logger) error {
req := c.Request()
res := c.Response()
start := time.Now()
err := next(c)
if err != nil {
return err
}
stop := time.Now()
p := req.URL.Path
if p == "" {
p = "/"
}
bytesIn := req.Header.Get(echo.HeaderContentLength)
if bytesIn == "" {
bytesIn = "0"
}
requestID := req.Header.Get(echo.HeaderXRequestID)
if requestID == "" {
requestID = res.Header().Get(echo.HeaderXRequestID)
}
log.WithFields(map[string]interface{}{
"id": requestID,
"time_rfc3339": time.Now().Format(time.RFC3339),
"remote_ip": c.RealIP(),
"host": req.Host,
"uri": req.RequestURI,
"method": req.Method,
"path": p,
"referer": req.Referer(),
"user_agent": req.UserAgent(),
"status": res.Status,
"latency": strconv.FormatInt(stop.Sub(start).Nanoseconds()/1000, 10),
"latency_human": stop.Sub(start).String(),
"bytes_in": bytesIn,
"bytes_out": strconv.FormatInt(res.Size, 10),
"headers": req.Header,
"query": req.URL.Query(),
}).Info("Handled request")
return nil
}
func loggerMiddleware(log *logger.Logger) echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
return loggerMiddlewareHandler(c, next, log)
}
}
}
func setLogMiddleware(e *echo.Echo, log *logger.Logger) {
e.Logger = &echoLogger{log}
e.Pre(loggerMiddleware(log))
}