Basic buffered filelogger

This commit is contained in:
Matthias Fulz 2020-11-11 11:13:59 +01:00
parent 482966589f
commit f08d3c1163
1 changed files with 45 additions and 5 deletions

View File

@ -8,8 +8,27 @@ import (
)
type FileLogger struct {
w *os.File
l sync.Mutex
w *os.File
l sync.Mutex
buffer chan []byte
buffered bool
}
func (f *FileLogger) flush() {
f.l.Lock()
defer func() {
f.w.Sync()
f.l.Unlock()
}()
if !f.buffered {
return
}
for msg := range f.buffer {
// TODO: errors?
f.w.Write(msg)
}
}
func (f *FileLogger) Write(p []byte) (n int, err error) {
@ -17,6 +36,15 @@ func (f *FileLogger) Write(p []byte) (n int, err error) {
return 0, fmt.Errorf("No file handle available")
}
if f.buffered {
if len(f.buffer) == cap(f.buffer) {
f.flush()
}
f.buffer <- p
return len(p), nil
}
f.l.Lock()
defer func() {
f.w.Sync()
@ -31,18 +59,30 @@ func (f *FileLogger) Close() error {
return nil
}
f.l.Lock()
defer f.l.Unlock()
f.flush()
return f.w.Close()
}
func NewFileLogger(file string) (ret io.WriteCloser, err error) {
func newFileLogger(file string, buffer int) (ret io.WriteCloser, err error) {
rret := &FileLogger{}
rret.buffered = false
if rret.w, err = os.OpenFile(file, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err != nil {
return nil, err
}
if buffer > 0 {
rret.buffer = make(chan []byte, buffer)
rret.buffered = true
}
return rret, nil
}
func NewFileLogger(file string) (ret io.WriteCloser, err error) {
return newFileLogger(file, 0)
}
func NewBufferedFileLogger(file string, buffer int) (ret io.WriteCloser, err error) {
return newFileLogger(file, buffer)
}