@@ -6,19 +6,25 @@ import (
6
6
"fmt"
7
7
"io"
8
8
"iter"
9
- "log"
10
9
"sync"
11
10
"time"
12
11
12
+ "github.com/ARM-software/golang-utils/utils/commonerrors"
13
13
"github.com/ARM-software/golang-utils/utils/parallelisation"
14
14
)
15
15
16
- var _ Loggers = & FIFOLoggers {}
17
-
18
16
type FIFOWriter struct {
19
17
io.WriteCloser
20
- mu sync.RWMutex
21
- Logs bytes.Buffer
18
+ source string
19
+ mu sync.RWMutex
20
+ Logs bytes.Buffer
21
+ }
22
+
23
+ func (w * FIFOWriter ) SetSource (source string ) (err error ) {
24
+ w .mu .RLock ()
25
+ defer w .mu .RUnlock ()
26
+ w .source = source
27
+ return
22
28
}
23
29
24
30
func (w * FIFOWriter ) Write (p []byte ) (n int , err error ) {
@@ -109,20 +115,47 @@ func (w *FIFOWriter) ReadLines(ctx context.Context) iter.Seq[string] {
109
115
}
110
116
111
117
type FIFOLoggers struct {
112
- GenericLoggers
113
- LogWriter FIFOWriter
118
+ Output WriterWithSource
119
+ Error WriterWithSource
120
+ LogWriter * FIFOWriter
121
+ newline bool
122
+ }
123
+
124
+ func (l * FIFOLoggers ) SetLogSource (source string ) error {
125
+ err := l .Check ()
126
+ if err != nil {
127
+ return err
128
+ }
129
+ return l .Output .SetSource (source )
130
+ }
131
+
132
+ func (l * FIFOLoggers ) SetLoggerSource (source string ) error {
133
+ err := l .Check ()
134
+ if err != nil {
135
+ return err
136
+ }
137
+ return l .Output .SetSource (source )
114
138
}
115
139
116
140
func (l * FIFOLoggers ) Log (output ... interface {}) {
117
- l .Output .Print (output ... )
141
+ _ , _ = l .Output .Write ([]byte (fmt .Sprint (output ... )))
142
+ if l .newline {
143
+ _ , _ = l .Output .Write ([]byte ("\n " ))
144
+ }
118
145
}
119
146
120
147
func (l * FIFOLoggers ) LogError (err ... interface {}) {
121
- l .Error .Print (err ... )
148
+ _ , _ = l .Error .Write ([]byte (fmt .Sprint (err ... )))
149
+ if l .newline {
150
+ _ , _ = l .Output .Write ([]byte ("\n " ))
151
+ }
122
152
}
123
153
124
154
func (l * FIFOLoggers ) Check () error {
125
- return l .GenericLoggers .Check ()
155
+ if l .Error == nil || l .Output == nil {
156
+ return commonerrors .ErrNoLogger
157
+ }
158
+ return nil
126
159
}
127
160
128
161
func (l * FIFOLoggers ) Read () string {
@@ -135,24 +168,24 @@ func (l *FIFOLoggers) ReadLines(ctx context.Context) iter.Seq[string] {
135
168
136
169
// Close closes the logger
137
170
func (l * FIFOLoggers ) Close () (err error ) {
138
- err = l .LogWriter .Close ()
139
- if err != nil {
140
- return
141
- }
142
- err = l .GenericLoggers .Close ()
143
- return
171
+ return l .LogWriter .Close ()
144
172
}
145
173
146
174
// NewFIFOLogger creates a logger to a bytes buffer.
147
175
// All messages (whether they are output or error) are merged together.
148
176
// Once messages have been accessed they are gone
149
- func NewFIFOLogger (loggerSource string ) (loggers * FIFOLoggers , err error ) {
150
- loggers = & FIFOLoggers {
151
- LogWriter : FIFOWriter {},
177
+ func NewFIFOLogger () (loggers * FIFOLoggers , err error ) {
178
+ l , err := NewNoopLogger ("Noop Logger" )
179
+ if err != nil {
180
+ return
152
181
}
153
- loggers .GenericLoggers = GenericLoggers {
154
- Output : log .New (& loggers .LogWriter , fmt .Sprintf ("[%v] Output: " , loggerSource ), log .LstdFlags ),
155
- Error : log .New (& loggers .LogWriter , fmt .Sprintf ("[%v] Error: " , loggerSource ), log .LstdFlags ),
182
+ logWriter := & FIFOWriter {}
183
+
184
+ loggers = & FIFOLoggers {
185
+ LogWriter : logWriter ,
186
+ newline : true ,
187
+ Output : NewDiodeWriterForSlowWriter (logWriter , 10000 , 50 * time .Millisecond , l ),
188
+ Error : NewDiodeWriterForSlowWriter (logWriter , 10000 , 50 * time .Millisecond , l ),
156
189
}
157
190
return
158
191
}
@@ -161,12 +194,16 @@ func NewFIFOLogger(loggerSource string) (loggers *FIFOLoggers, err error) {
161
194
// All messages (whether they are output or error) are merged together.
162
195
// Once messages have been accessed they are gone
163
196
func NewPlainFIFOLogger () (loggers * FIFOLoggers , err error ) {
164
- loggers = & FIFOLoggers {
165
- LogWriter : FIFOWriter {},
197
+ l , err := NewNoopLogger ("Noop Logger" )
198
+ if err != nil {
199
+ return
166
200
}
167
- loggers .GenericLoggers = GenericLoggers {
168
- Output : log .New (& loggers .LogWriter , "" , 0 ),
169
- Error : log .New (& loggers .LogWriter , "" , 0 ),
201
+
202
+ logWriter := & FIFOWriter {}
203
+ loggers = & FIFOLoggers {
204
+ LogWriter : logWriter ,
205
+ Output : NewDiodeWriterForSlowWriter (logWriter , 10000 , 50 * time .Millisecond , l ),
206
+ Error : NewDiodeWriterForSlowWriter (logWriter , 10000 , 50 * time .Millisecond , l ),
170
207
}
171
208
return
172
209
}
0 commit comments