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 := b.String()
 | |
| 
 | |
| 	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
 | |
| }
 |