/
apexlogs.go
89 lines (72 loc) · 1.64 KB
/
apexlogs.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
// Package apexlogs implements a handler for Apex Logs.
package apexlogs
import (
"net/http"
"sync"
"github.com/apex/log"
"github.com/apex/logs/go/logs"
)
// TODO: periodic buffering
var levelMap = map[log.Level]string{
log.DebugLevel: "debug",
log.InfoLevel: "info",
log.WarnLevel: "warning",
log.ErrorLevel: "error",
log.FatalLevel: "emergency",
}
// Handler implementation.
type Handler struct {
// URL is the endpoint for your Apex Logs deployment API.
URL string
// ProjectID is the id of the project that you are collecting logs for.
ProjectID string
// HTTPClient is the client used for making requests, defaulting to http.DefaultClient.
HTTPClient *http.Client
// buffer
mu sync.Mutex
buffer []logs.Event
// client
once sync.Once
c logs.Client
}
// HandleLog implements log.Handler.
func (h *Handler) HandleLog(e *log.Entry) error {
// create event
event := logs.Event{
Level: levelMap[e.Level],
Message: e.Message,
Fields: map[string]interface{}(e.Fields),
Timestamp: e.Timestamp,
}
// buffer event
h.mu.Lock()
h.buffer = append(h.buffer, event)
h.mu.Unlock()
return nil
}
// Events returns the buffered events, and clears the buffer.
func (h *Handler) Events() (events []logs.Event) {
h.mu.Lock()
events = h.buffer
h.buffer = nil
h.mu.Unlock()
return
}
// Flush all buffered logs.
func (h *Handler) Flush() error {
events := h.Events()
if len(events) == 0 {
return nil
}
// initialize client
h.once.Do(func() {
h.c = logs.Client{
URL: h.URL,
HTTPClient: h.HTTPClient,
}
})
return h.c.AddEvents(logs.AddEventsInput{
ProjectID: h.ProjectID,
Events: events,
})
}