47aa47e3f6
This PR is for issue of "email after registry webapp panic" #41, improving my previous design (closed). It use self setting up hooks, to catch panic in web application. And, send email in hooks handle directly, to no use new http server and handler. Signed-off-by: xiekeyang <keyangxie@126.com>
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
|
|
}
|