You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
1.9 KiB
101 lines
1.9 KiB
package logruspan
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"gitea.baoapi.com/root/stu_uuos/config"
|
|
"github.com/sirupsen/logrus"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
//setupLogrus 初始化logrus 同时把logrus的logger var 引用到这个common.Logger
|
|
func setupLogrus(cc config.LogrusHttp) error {
|
|
|
|
logLvl, err := logrus.ParseLevel(cc.LogLvl)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
Lobj.SetLevel(logLvl)
|
|
Lobj.SetReportCaller(true)
|
|
Lobj.SetFormatter(&logrus.JSONFormatter{})
|
|
|
|
esh := newHttpHook(cc)
|
|
Lobj.AddHook(esh)
|
|
return nil
|
|
}
|
|
|
|
var Lobj *logrus.Logger
|
|
|
|
func LogInitHttp() {
|
|
cc := *config.GetConfig().LogrusHttp
|
|
Lobj = logrus.New()
|
|
err := setupLogrus(cc)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
//esHook 自定义的ES hook
|
|
type esHook struct {
|
|
client *http.Client
|
|
Url string
|
|
Cont string
|
|
}
|
|
|
|
//newEsHook 初始化
|
|
func newHttpHook(cc config.LogrusHttp) *esHook {
|
|
//application/json;charset:utf-8;
|
|
es := &http.Client{}
|
|
return &esHook{
|
|
client: es,
|
|
Url: cc.Url + "/logger",
|
|
Cont: "application/json;charset:utf-8;",
|
|
}
|
|
}
|
|
|
|
//Fire logrus hook interface 方法
|
|
func (hook *esHook) Fire(entry *logrus.Entry) error {
|
|
go hook.sendHttp(entry)
|
|
return nil
|
|
}
|
|
|
|
//Levels logrus hook interface 方法
|
|
func (hook *esHook) Levels() []logrus.Level {
|
|
return []logrus.Level{
|
|
logrus.PanicLevel,
|
|
logrus.FatalLevel,
|
|
logrus.ErrorLevel,
|
|
logrus.InfoLevel,
|
|
}
|
|
}
|
|
|
|
//sendEs 异步发送日志到es
|
|
func (hook *esHook) sendHttp(e *logrus.Entry) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
fmt.Println("send entry to http failed: ", r)
|
|
}
|
|
}()
|
|
|
|
ins := map[string]interface{}{}
|
|
for kk, vv := range e.Data {
|
|
ins[kk] = vv
|
|
}
|
|
|
|
ins["time"] = time.Now().Local()
|
|
ins["level"] = e.Level
|
|
ins["message"] = e.Message
|
|
ins["caller"] = fmt.Sprintf("%s:%d %#v", e.Caller.File, e.Caller.Line, e.Caller.Func)
|
|
|
|
bs, err := json.Marshal(ins)
|
|
br := bytes.NewBuffer(bs)
|
|
|
|
_, err = hook.client.Post(hook.Url, hook.Cont, br)
|
|
if err != nil {
|
|
logrus.Println(err)
|
|
}
|
|
|
|
}
|