Skip to content

Commit 1e9d02b

Browse files
diode thing
1 parent 68199f6 commit 1e9d02b

File tree

2 files changed

+70
-31
lines changed

2 files changed

+70
-31
lines changed

utils/logs/fifo_logger.go

Lines changed: 64 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,25 @@ import (
66
"fmt"
77
"io"
88
"iter"
9-
"log"
109
"sync"
1110
"time"
1211

12+
"github.com/ARM-software/golang-utils/utils/commonerrors"
1313
"github.com/ARM-software/golang-utils/utils/parallelisation"
1414
)
1515

16-
var _ Loggers = &FIFOLoggers{}
17-
1816
type FIFOWriter struct {
1917
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
2228
}
2329

2430
func (w *FIFOWriter) Write(p []byte) (n int, err error) {
@@ -109,20 +115,47 @@ func (w *FIFOWriter) ReadLines(ctx context.Context) iter.Seq[string] {
109115
}
110116

111117
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)
114138
}
115139

116140
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+
}
118145
}
119146

120147
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+
}
122152
}
123153

124154
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
126159
}
127160

128161
func (l *FIFOLoggers) Read() string {
@@ -135,24 +168,24 @@ func (l *FIFOLoggers) ReadLines(ctx context.Context) iter.Seq[string] {
135168

136169
// Close closes the logger
137170
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()
144172
}
145173

146174
// NewFIFOLogger creates a logger to a bytes buffer.
147175
// All messages (whether they are output or error) are merged together.
148176
// 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
152181
}
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),
156189
}
157190
return
158191
}
@@ -161,12 +194,16 @@ func NewFIFOLogger(loggerSource string) (loggers *FIFOLoggers, err error) {
161194
// All messages (whether they are output or error) are merged together.
162195
// Once messages have been accessed they are gone
163196
func NewPlainFIFOLogger() (loggers *FIFOLoggers, err error) {
164-
loggers = &FIFOLoggers{
165-
LogWriter: FIFOWriter{},
197+
l, err := NewNoopLogger("Noop Logger")
198+
if err != nil {
199+
return
166200
}
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),
170207
}
171208
return
172209
}

utils/logs/fifo_logger_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ import (
1212
)
1313

1414
func TestFIFOLoggerRead(t *testing.T) {
15-
loggers, err := NewFIFOLogger("Test")
15+
loggers, err := NewFIFOLogger()
1616
require.NoError(t, err)
1717
testLog(t, loggers)
1818
loggers.LogError("Test err")
1919
loggers.Log("Test1")
2020
contents := loggers.Read()
2121
require.NotEmpty(t, contents)
22+
time.Sleep(200 * time.Millisecond) // account for slow polling
2223
require.True(t, strings.Contains(contents, "Test err"))
2324
require.True(t, strings.Contains(contents, "Test1"))
2425
loggers.Log("Test2")
@@ -37,6 +38,7 @@ func TestPlainFIFOLoggerRead(t *testing.T) {
3738
testLog(t, loggers)
3839
loggers.LogError("Test err")
3940
loggers.Log("Test1")
41+
time.Sleep(200 * time.Millisecond) // account for slow polling
4042
contents := loggers.Read()
4143
require.NotEmpty(t, contents)
4244
require.True(t, strings.Contains(contents, "Test err"))
@@ -52,7 +54,7 @@ func TestPlainFIFOLoggerRead(t *testing.T) {
5254
}
5355

5456
func TestFIFOLoggerReadlines(t *testing.T) {
55-
loggers, err := NewFIFOLogger("Test")
57+
loggers, err := NewFIFOLogger()
5658
require.NoError(t, err)
5759
testLog(t, loggers)
5860
loggers.LogError("Test err\n")
@@ -85,7 +87,7 @@ func TestPlainFIFOLoggerReadlines(t *testing.T) {
8587
loggers.Log("Test1")
8688
loggers.Log("\n\n\n")
8789
time.Sleep(200 * time.Millisecond)
88-
loggers.Log("Test2")
90+
loggers.Log("Test2\n")
8991
}()
9092

9193
count := 0
@@ -99,6 +101,6 @@ func TestPlainFIFOLoggerReadlines(t *testing.T) {
99101
count++
100102
}
101103

102-
assert.Equal(t, "Test err\nTest1\nTest2\n", b.String())
104+
assert.Equal(t, "Test errTest1\nTest2\n", b.String())
103105
assert.Equal(t, 3, count)
104106
}

0 commit comments

Comments
 (0)