task_tracker/api/log.go
2019-01-12 16:20:25 -05:00

92 lines
1.7 KiB
Go

package api
import (
"errors"
"github.com/Sirupsen/logrus"
"github.com/valyala/fasthttp"
"time"
)
type RequestHandler func(*Request)
type LogEntry struct {
Scope string `json:"scope"`
Message string `json:"Message"`
TimeStamp int64 `json:"timestamp"`
}
func (e *LogEntry) Time() time.Time {
t := time.Unix(e.TimeStamp, 0)
return t
}
func LogRequest(h RequestHandler) fasthttp.RequestHandler {
return fasthttp.RequestHandler(func(ctx *fasthttp.RequestCtx) {
logrus.WithFields(logrus.Fields{
"path": string(ctx.Path()),
}).Info(string(ctx.Method()))
h(&Request{Ctx: ctx})
})
}
func SetupLogger() {
logrus.SetLevel(logrus.TraceLevel) //todo: from conf
}
func parseLogEntry(r *Request) *LogEntry {
entry := LogEntry{}
if r.GetJson(&entry) {
if len(entry.Message) == 0 {
handleErr(errors.New("invalid message"), r)
} else if len(entry.Scope) == 0 {
handleErr(errors.New("invalid scope"), r)
} else if entry.TimeStamp <= 0 {
handleErr(errors.New("invalid timestamp"), r)
}
}
return &entry
}
func LogTrace(r *Request) {
entry := parseLogEntry(r)
logrus.WithFields(logrus.Fields{
"scope": entry.Scope,
}).WithTime(entry.Time()).Trace(entry.Message)
}
func LogInfo(r *Request) {
entry := parseLogEntry(r)
logrus.WithFields(logrus.Fields{
"scope": entry.Scope,
}).WithTime(entry.Time()).Info(entry.Message)
}
func LogWarn(r *Request) {
entry := parseLogEntry(r)
logrus.WithFields(logrus.Fields{
"scope": entry.Scope,
}).WithTime(entry.Time()).Warn(entry.Message)
}
func LogError(r *Request) {
entry := parseLogEntry(r)
logrus.WithFields(logrus.Fields{
"scope": entry.Scope,
}).WithTime(entry.Time()).Error(entry.Message)
}