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 }