-
Notifications
You must be signed in to change notification settings - Fork 7
/
log-api.go
122 lines (94 loc) · 2.15 KB
/
log-api.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package rest
import (
"encoding/json"
"github.com/apibrew/apibrew/pkg/service"
"github.com/gorilla/mux"
"github.com/sirupsen/logrus"
"net/http"
)
type LogApi interface {
ConfigureRouter(r *mux.Router)
}
type logApi struct {
handler *chan *logrus.Entry
authorizationService service.AuthorizationService
}
func (r *logApi) Levels() []logrus.Level {
return logrus.AllLevels
}
func (r *logApi) Fire(entry *logrus.Entry) error {
if r.handler != nil {
*r.handler <- entry
}
return nil
}
func (r *logApi) ConfigureRouter(router *mux.Router) {
router.HandleFunc("/_logs", r.pollLogs).Methods("GET")
}
func (r *logApi) pollLogs(writer http.ResponseWriter, request *http.Request) {
if err := r.authorizationService.CheckIsExtensionController(request.Context()); err != nil {
handleError(writer, err)
return
}
levelStr := request.URL.Query().Get("level")
format := request.URL.Query().Get("format")
if levelStr == "" {
levelStr = "debug"
}
level, err := logrus.ParseLevel(levelStr)
if err != nil {
handleError(writer, err)
return
}
writer.WriteHeader(200)
handler := make(chan *logrus.Entry, 100)
r.handler = &handler
defer func() {
r.handler = nil
close(handler)
}()
for {
select {
case <-request.Context().Done():
return
case entry := <-handler:
if entry.Level <= level {
if format == "json" {
data, err := json.Marshal(map[string]interface{}{
"caller": entry.Caller,
"time": entry.Time,
"level": entry.Level.String(),
"message": entry.Message,
"fields": entry.Data,
})
if err != nil {
handleError(writer, err)
return
}
data = append(data, []byte("\n")...)
_, _ = writer.Write(data)
} else {
data, err := entry.Bytes()
if err != nil {
handleError(writer, err)
return
}
_, _ = writer.Write(data)
}
if f, ok := writer.(http.Flusher); ok {
f.Flush()
}
}
}
}
}
func (r *logApi) InitHook() {
logrus.AddHook(r)
}
func NewLogApi(container service.Container) LogApi {
la := &logApi{
authorizationService: container.GetAuthorizationService(),
}
la.InitHook()
return la
}