100 lines
1.8 KiB
Go

package storage
import (
"encoding/json"
"github.com/simon987/task_tracker/config"
"github.com/sirupsen/logrus"
)
type LogEntry struct {
Message string `json:"message"`
Timestamp int64 `json:"timestamp"`
Data string `json:"data"`
Level LogLevel `json:"level"`
}
type LogLevel int
const (
FATAL LogLevel = 1
PANIC LogLevel = 2
ERROR LogLevel = 3
WARN LogLevel = 4
INFO LogLevel = 5
DEBUG LogLevel = 6
TRACE LogLevel = 7
)
type sqlLogHook struct {
database *Database
}
func (h sqlLogHook) Levels() []logrus.Level {
return config.Cfg.DbLogLevels
}
func (h sqlLogHook) Fire(entry *logrus.Entry) error {
db := h.database.getDB()
jsonData, err := json.Marshal(entry.Data)
if err != nil {
return err
}
var logLevel LogLevel
switch entry.Level {
case logrus.TraceLevel:
logLevel = TRACE
case logrus.DebugLevel:
logLevel = DEBUG
case logrus.InfoLevel:
logLevel = INFO
case logrus.WarnLevel:
logLevel = WARN
case logrus.ErrorLevel:
logLevel = ERROR
case logrus.FatalLevel:
logLevel = FATAL
case logrus.PanicLevel:
logLevel = PANIC
}
_, err = db.Exec("INSERT INTO log_entry (message, level, message_data, timestamp) VALUES ($1,$2,$3,$4)",
entry.Message, logLevel, jsonData, entry.Time.Unix())
return err
}
func (database *Database) SetupLoggerHook() {
hook := sqlLogHook{}
hook.database = database
logrus.AddHook(hook)
}
func (database *Database) GetLogs(since int64, level LogLevel) *[]LogEntry {
db := database.getDB()
var logs []LogEntry
rows, err := db.Query("SELECT * FROM log_entry WHERE timestamp > $1 AND level=$2",
since, level)
handleErr(err)
if err != nil {
return nil
}
for rows.Next() {
e := LogEntry{}
err := rows.Scan(&e.Level, &e.Message, &e.Data, &e.Timestamp)
handleErr(err)
logs = append(logs, e)
}
return &logs
}