49 lines
675 B
Go
49 lines
675 B
Go
package slog
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"sync"
|
|
)
|
|
|
|
type FileLogger struct {
|
|
w *os.File
|
|
l sync.Mutex
|
|
}
|
|
|
|
func (f *FileLogger) Write(p []byte) (n int, err error) {
|
|
if f.w == nil {
|
|
return 0, fmt.Errorf("No file handle available")
|
|
}
|
|
|
|
f.l.Lock()
|
|
defer func() {
|
|
f.w.Sync()
|
|
f.l.Unlock()
|
|
}()
|
|
|
|
return f.w.Write(p)
|
|
}
|
|
|
|
func (f *FileLogger) Close() error {
|
|
if f.w == nil {
|
|
return nil
|
|
}
|
|
|
|
f.l.Lock()
|
|
defer f.l.Unlock()
|
|
|
|
return f.w.Close()
|
|
}
|
|
|
|
func NewFileLogger(file string) (ret io.WriteCloser, err error) {
|
|
rret := &FileLogger{}
|
|
|
|
if rret.w, err = os.OpenFile(file, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return rret, nil
|
|
}
|