task_tracker/api/log.go
2019-01-21 20:16:30 -05:00

146 lines
2.7 KiB
Go

package api
import (
"errors"
"github.com/Sirupsen/logrus"
"github.com/valyala/fasthttp"
"src/task_tracker/config"
"src/task_tracker/storage"
"time"
)
type RequestHandler func(*Request)
type GetLogRequest struct {
Level logrus.Level `json:"level"`
Since int64 `json:"since"`
}
type LogRequest struct {
Scope string `json:"scope"`
Message string `json:"Message"`
TimeStamp int64 `json:"timestamp"`
}
type GetLogResponse struct {
Ok bool `json:"ok"`
Message string `json:"message"`
Logs *[]storage.LogEntry `json:"logs"`
}
func (e *LogRequest) Time() time.Time {
t := time.Unix(e.TimeStamp, 0)
return t
}
func LogRequestMiddleware(h RequestHandler) fasthttp.RequestHandler {
return fasthttp.RequestHandler(func(ctx *fasthttp.RequestCtx) {
logrus.WithFields(logrus.Fields{
"path": string(ctx.Path()),
"header": ctx.Request.Header.String(),
}).Trace(string(ctx.Method()))
h(&Request{Ctx: ctx})
})
}
func (api *WebAPI) SetupLogger() {
logrus.SetLevel(config.Cfg.LogLevel)
api.Database.SetupLoggerHook()
}
func parseLogEntry(r *Request) *LogRequest {
entry := LogRequest{}
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)
}
func (api *WebAPI) GetLog(r *Request) {
req := &GetLogRequest{}
if r.GetJson(req) {
if req.isValid() {
logs := api.Database.GetLogs(req.Since, req.Level)
logrus.WithFields(logrus.Fields{
"getLogRequest": req,
"logCount": len(*logs),
}).Trace("Get log request")
r.OkJson(GetLogResponse{
Ok: true,
Logs: logs,
})
} else {
logrus.WithFields(logrus.Fields{
"getLogRequest": req,
}).Warn("Invalid log request")
r.Json(GetLogResponse{
Ok: false,
Message: "Invalid log request",
}, 400)
}
}
}
func (r GetLogRequest) isValid() bool {
if r.Since <= 0 {
return false
}
return true
}