This repository has been archived by the owner on May 10, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 80
/
logstream.go
109 lines (90 loc) · 1.72 KB
/
logstream.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
package logstream
import (
"fmt"
"strconv"
"sync"
"sync/atomic"
"github.com/sirupsen/logrus"
)
var (
logs = map[string]LoggerStream{}
lock = sync.Mutex{}
counter int64 = 1
)
type LogEvent struct {
Error bool
Message string
}
type Logger interface {
Infof(msg string, args ...interface{})
Warnf(msg string, args ...interface{})
Debugf(msg string, args ...interface{})
}
type LoggerStream interface {
Logger
ID() string
Stream() <-chan LogEvent
Close()
}
func GetLogStream(id string) LoggerStream {
lock.Lock()
defer lock.Unlock()
return logs[id]
}
func NewLogStream() LoggerStream {
id := atomic.AddInt64(&counter, 1)
ls := newLoggerStream(strconv.FormatInt(id, 10))
lock.Lock()
logs[ls.ID()] = ls
lock.Unlock()
return ls
}
type loggerStream struct {
sync.Mutex
closed bool
id string
c chan LogEvent
}
func newLoggerStream(id string) LoggerStream {
return &loggerStream{
id: id,
c: make(chan LogEvent, 100),
}
}
func (l *loggerStream) Infof(msg string, args ...interface{}) {
l.write(false, msg, args...)
}
func (l *loggerStream) Warnf(msg string, args ...interface{}) {
l.write(true, msg, args...)
}
func (l *loggerStream) Debugf(msg string, args ...interface{}) {
logrus.Debugf(msg, args...)
}
func (l *loggerStream) write(error bool, msg string, args ...interface{}) {
msg = fmt.Sprintf(msg, args...)
l.Lock()
if !l.closed {
l.c <- LogEvent{
Error: error,
Message: msg,
}
}
l.Unlock()
}
func (l *loggerStream) ID() string {
return l.id
}
func (l *loggerStream) Stream() <-chan LogEvent {
return l.c
}
func (l *loggerStream) Close() {
l.Lock()
if !l.closed {
close(l.c)
l.closed = true
}
l.Unlock()
lock.Lock()
delete(logs, l.id)
lock.Unlock()
}