-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsvc.go
More file actions
72 lines (62 loc) · 1.75 KB
/
Copy pathsvc.go
File metadata and controls
72 lines (62 loc) · 1.75 KB
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
package relay
import (
"os"
"sync"
"time"
"github.com/joy-dx/relay/config"
"github.com/joy-dx/relay/dto"
)
// RelaySvc Is a pseudo logger interface that allows for rich structs to be included alongside messsages. it is
// up to the developer / configuration to subscribe to the relay as sinks
type RelaySvc struct {
sinks []dto.RelaySinkInterface
cfg *config.RelaySvcConfig
mu sync.RWMutex
}
func (r *RelaySvc) RegisterSink(sink dto.RelaySinkInterface) {
r.sinks = append(r.sinks, sink)
}
func (r *RelaySvc) Close() error {
var closeErr error
for _, sink := range r.sinks {
if err := sink.Close(); err != nil {
closeErr = err
}
}
return closeErr
}
func (r *RelaySvc) emit(level dto.RelayLevel, event dto.RelayEventInterface) {
emittedEvent := dto.EmittedEvent{
Time: time.Now(),
Level: level,
Event: event,
}
// dispatch to registered sinks
for _, sink := range r.sinks {
switch level {
case dto.Debug:
sink.Debug(emittedEvent)
case dto.Info:
sink.Info(emittedEvent)
case dto.Warn:
sink.Warn(emittedEvent)
case dto.Error:
sink.Error(emittedEvent)
case dto.Fatal:
sink.Fatal(emittedEvent)
case dto.Meta:
sink.Meta(emittedEvent)
}
}
// After draining all the sinks, exit if fatal
if level == dto.Fatal {
os.Exit(1)
}
}
func (r *RelaySvc) Debug(e dto.RelayEventInterface) { r.emit(dto.Debug, e) }
func (r *RelaySvc) Info(e dto.RelayEventInterface) { r.emit(dto.Info, e) }
func (r *RelaySvc) Warn(e dto.RelayEventInterface) { r.emit(dto.Warn, e) }
func (r *RelaySvc) Error(e dto.RelayEventInterface) { r.emit(dto.Error, e) }
func (r *RelaySvc) Fatal(e dto.RelayEventInterface) { r.emit(dto.Fatal, e) }
// Meta A special handler for
func (r *RelaySvc) Meta(e dto.RelayEventInterface) { r.emit(dto.Meta, e) }