forked from TrueCloudLab/distribution
54 lines
1.1 KiB
Go
54 lines
1.1 KiB
Go
|
package handlers
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
"text/template"
|
||
|
|
||
|
"github.com/Sirupsen/logrus"
|
||
|
)
|
||
|
|
||
|
// logHook is for hooking Panic in web application
|
||
|
type logHook struct {
|
||
|
LevelsParam []string
|
||
|
Mail *mailer
|
||
|
}
|
||
|
|
||
|
// Fire forwards an error to LogHook
|
||
|
func (hook *logHook) Fire(entry *logrus.Entry) error {
|
||
|
addr := strings.Split(hook.Mail.Addr, ":")
|
||
|
if len(addr) != 2 {
|
||
|
return errors.New("Invalid Mail Address")
|
||
|
}
|
||
|
host := addr[0]
|
||
|
subject := fmt.Sprintf("[%s] %s: %s", entry.Level, host, entry.Message)
|
||
|
|
||
|
html := `
|
||
|
{{.Message}}
|
||
|
|
||
|
{{range $key, $value := .Data}}
|
||
|
{{$key}}: {{$value}}
|
||
|
{{end}}
|
||
|
`
|
||
|
b := bytes.NewBuffer(make([]byte, 0))
|
||
|
t := template.Must(template.New("mail body").Parse(html))
|
||
|
if err := t.Execute(b, entry); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
body := fmt.Sprintf("%s", b)
|
||
|
|
||
|
return hook.Mail.sendMail(subject, body)
|
||
|
}
|
||
|
|
||
|
// Levels contains hook levels to be catched
|
||
|
func (hook *logHook) Levels() []logrus.Level {
|
||
|
levels := []logrus.Level{}
|
||
|
for _, v := range hook.LevelsParam {
|
||
|
lv, _ := logrus.ParseLevel(v)
|
||
|
levels = append(levels, lv)
|
||
|
}
|
||
|
return levels
|
||
|
}
|