Basic buffered filelogger
This commit is contained in:
parent
482966589f
commit
f08d3c1163
@ -10,6 +10,25 @@ import (
|
|||||||
type FileLogger struct {
|
type FileLogger struct {
|
||||||
w *os.File
|
w *os.File
|
||||||
l sync.Mutex
|
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) {
|
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")
|
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()
|
f.l.Lock()
|
||||||
defer func() {
|
defer func() {
|
||||||
f.w.Sync()
|
f.w.Sync()
|
||||||
@ -31,18 +59,30 @@ func (f *FileLogger) Close() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
f.l.Lock()
|
f.flush()
|
||||||
defer f.l.Unlock()
|
|
||||||
|
|
||||||
return f.w.Close()
|
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 := &FileLogger{}
|
||||||
|
rret.buffered = false
|
||||||
|
|
||||||
if rret.w, err = os.OpenFile(file, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err != nil {
|
if rret.w, err = os.OpenFile(file, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if buffer > 0 {
|
||||||
|
rret.buffer = make(chan []byte, buffer)
|
||||||
|
rret.buffered = true
|
||||||
|
}
|
||||||
|
|
||||||
return rret, nil
|
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)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user