package es import ( "encoding/json" "errors" "fmt" "net" "net/http" "net/url" "time" "golib.gaore.com/GaoreGo/goes" "golib.gaore.com/GaoreGo/grlogs/logs" ) // NewES return a LoggerInterface func NewES() logs.Logger { cw := &esLogger{ Level: logs.LevelDebug, } return cw } type esLogger struct { *goes.Client Username string `json:"username"` Password string `json:"password"` DSN string `json:"dsn"` Level int `json:"level"` IndexName string `json:"index"` } // {"dsn":"http://localhost:9200/","level":1} func (el *esLogger) Init(jsonconfig string) error { err := json.Unmarshal([]byte(jsonconfig), el) if err != nil { return err } if el.DSN == "" { return errors.New("empty dsn") } else if u, err := url.Parse(el.DSN); err != nil { return err } else if u.Path == "" { return errors.New("missing prefix") } else if host, port, err := net.SplitHostPort(u.Host); err != nil { return err } else { tr := &http.Transport{ ResponseHeaderTimeout: 3 * time.Second, } cl := &http.Client{ Transport: tr, } conn := goes.NewClient(host, port) conn.AuthUsername = el.Username conn.AuthPassword = el.Password conn.WithHTTPClient(cl) el.Client = conn } return nil } // WriteMsg will write the msg and level into es func (el *esLogger) WriteMsg(when time.Time, msg string, level int, lable string, env string) error { if level > el.Level { return nil } vals := make(map[string]interface{}) vals["@timestamp"] = when.Format(time.RFC3339) vals["@msg"] = msg vals["@level"] = level vals["level_string"] = logs.GetLevelString(level) vals["env"] = env vals["lable"] = lable if el.IndexName == "" { return errors.New("index name is empty") } d := goes.Document{ Index: fmt.Sprintf("%s-%04d.%02d.%02d", el.IndexName, when.Year(), when.Month(), when.Day()), Type: "logs", Fields: vals, } _, err := el.Index(d, nil) return err } // Destroy is a empty method func (el *esLogger) Destroy() { } // Flush is a empty method func (el *esLogger) Flush() { } func init() { logs.Register(logs.AdapterEs, NewES) }