51 lines
703 B
Go
51 lines
703 B
Go
package slog
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"fmt"
|
|
"io"
|
|
"sync"
|
|
)
|
|
|
|
type BufferLogger struct {
|
|
w io.Writer
|
|
m sync.Mutex
|
|
b bytes.Buffer
|
|
silent bool
|
|
}
|
|
|
|
func (b *BufferLogger) Write(p []byte) (n int, err error) {
|
|
b.m.Lock()
|
|
defer b.m.Unlock()
|
|
|
|
return b.w.Write(p)
|
|
}
|
|
|
|
func (b *BufferLogger) Close() error {
|
|
b.FlushAll()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (b *BufferLogger) FlushAll() {
|
|
b.m.Lock()
|
|
defer b.m.Unlock()
|
|
|
|
w := b.w.(*bufio.Writer)
|
|
w.Flush()
|
|
if !b.silent {
|
|
fmt.Print(string(b.b.Bytes()))
|
|
}
|
|
b.b.Truncate(0)
|
|
b.w = bufio.NewWriter(&b.b)
|
|
}
|
|
|
|
func NewBufferLogger(silent bool) io.WriteCloser {
|
|
ret := &BufferLogger{}
|
|
ret.w = bufio.NewWriter(&ret.b)
|
|
ret.silent = silent
|
|
|
|
return ret
|
|
}
|