-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstream-multistream.go
139 lines (125 loc) · 3.39 KB
/
stream-multistream.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package logger
import "github.com/gildas/go-errors"
// MultiStream is the Stream that writes to several streams
type MultiStream struct {
streams []Streamer
}
// GetFilterLevels gets the filter levels
//
// # If the multi stream contains at least one stream, it returns the filter levels of the first stream
//
// implements logger.Streamer
func (stream *MultiStream) GetFilterLevels() LevelSet {
if len(stream.streams) == 0 {
return LevelSet{}
}
return stream.streams[0].GetFilterLevels()
}
// SetFilterLevel sets the filter level
//
// If present, the first parameter is the topic.
//
// If present, the second parameter is the scope.
//
// implements logger.FilterSetter
func (stream *MultiStream) SetFilterLevel(level Level, parameters ...string) {
for _, s := range stream.streams {
if setter, ok := s.(FilterSetter); ok {
setter.SetFilterLevel(level, parameters...)
}
}
}
// FilterMore tells the stream to filter more
//
// The stream will filter more if it is not already at the highest level.
// Which means less log messages will be written to the stream
//
// Example: if the stream is at DEBUG, it will be filtering at INFO
//
// implements logger.FilterModifier
func (stream *MultiStream) FilterMore() {
for _, s := range stream.streams {
if modifier, ok := s.(FilterModifier); ok {
modifier.FilterMore()
}
}
}
// FilterLess tells the stream to filter less
//
// The stream will filter less if it is not already at the lowest level.
// Which means more log messages will be written to the stream
//
// Example: if the stream is at INFO, it will be filtering at DEBUG
//
// implements logger.FilterModifier
func (stream *MultiStream) FilterLess() {
for _, s := range stream.streams {
if modifier, ok := s.(FilterModifier); ok {
modifier.FilterLess()
}
}
}
// ShouldLogSourceInfo tells if the source info should be logged
//
// # If at least one stream returns true, the stream should write the record
//
// implements logger.Streamer
func (stream *MultiStream) ShouldLogSourceInfo() bool {
for _, s := range stream.streams {
if s.ShouldLogSourceInfo() {
return true
}
}
return false
}
// Write writes the given Record
//
// implements logger.Streamer
func (stream *MultiStream) Write(record *Record) error {
var errs errors.MultiError
for _, s := range stream.streams {
if err := s.Write(record); err != nil {
errs.Append(err)
}
}
return errs.AsError()
}
// ShouldWrite tells if the given level should be written to this stream
//
// # If at least one stream returns true, the stream should write the record
//
// implements logger.Streamer
func (stream *MultiStream) ShouldWrite(level Level, topic, scope string) bool {
for _, s := range stream.streams {
if s.ShouldWrite(level, topic, scope) {
return true
}
}
return false
}
// Flush flushes the stream (makes sure records are actually written)
//
// implements logger.Streamer
func (stream *MultiStream) Flush() {
for _, s := range stream.streams {
s.Flush()
}
}
// Close closes the stream
//
// implements logger.Streamer
func (stream *MultiStream) Close() {
for _, s := range stream.streams {
s.Close()
}
}
// String gets a string version
//
// implements fmt.Stringer
func (stream MultiStream) String() string {
return "MultiStream"
}
// CreateMultiStream creates a MultiStream that contains all given Streamer objects
func CreateMultiStream(streams ...Streamer) Streamer {
return &MultiStream{streams: streams}
}