86 lines
1.8 KiB
Go
86 lines
1.8 KiB
Go
package client
|
|
|
|
import (
|
|
"io"
|
|
|
|
websocketLib "github.com/genofire/golang-lib/websocket"
|
|
"github.com/genofire/logmania/receive/logrus"
|
|
"github.com/google/uuid"
|
|
"github.com/gorilla/websocket"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// client logger
|
|
type Logmania struct {
|
|
URL string
|
|
Token uuid.UUID
|
|
Levels []log.Level
|
|
quere chan *log.Entry
|
|
conn *websocket.Conn
|
|
}
|
|
|
|
func NewClient(url string, token uuid.UUID, lvls ...log.Level) *Logmania {
|
|
logger := &Logmania{
|
|
URL: url,
|
|
Token: token,
|
|
Levels: lvls,
|
|
quere: make(chan *log.Entry),
|
|
}
|
|
conn, _, err := websocket.DefaultDialer.Dial(url, nil)
|
|
if err != nil {
|
|
log.Error("[logmania] error on connect: ", err)
|
|
return nil
|
|
}
|
|
logger.conn = conn
|
|
go logger.Start()
|
|
return logger
|
|
}
|
|
|
|
// Listen if logmania server want to close the connection
|
|
func (l *Logmania) listen() {
|
|
for {
|
|
var msg websocketLib.Message
|
|
err := websocket.ReadJSON(l.conn, &msg)
|
|
if err == io.EOF {
|
|
l.Close()
|
|
log.Warn("[logmania] close listener:", err)
|
|
} else if err != nil {
|
|
log.Println(err)
|
|
} else {
|
|
if msg.Subject == websocketLib.SessionMessageInit {
|
|
l.conn.WriteJSON(&websocketLib.Message{
|
|
Subject: websocketLib.SessionMessageInit,
|
|
ID: l.Token,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (l *Logmania) writer() {
|
|
for e := range l.quere {
|
|
err := l.conn.WriteJSON(&websocketLib.Message{
|
|
Subject: logrus.WS_LOG_ENTRY,
|
|
Body: e,
|
|
})
|
|
if err != nil {
|
|
log.Error("[logmania] could not send log entry:", err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (l *Logmania) Start() {
|
|
go l.listen()
|
|
l.writer()
|
|
}
|
|
|
|
func (l *Logmania) Fire(e *log.Entry) {
|
|
l.quere <- e
|
|
}
|
|
|
|
// close connection to logger
|
|
func (l *Logmania) Close() {
|
|
l.conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
|
|
close(l.quere)
|
|
}
|