diff --git a/CHANGELOG.md b/CHANGELOG.md index 179f15d..ff1cc36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,3 +7,5 @@ INFO -> Info, etc. - Uncompatible NoopBackend.Level() now returns DefaultLevel instead of Fatal - Fix: creates new logger with level DefaultLevel instead of Debug +- Fix: FileBackend now properly closes the file befor reopening it (fixes a + potential file descriptor leak) diff --git a/backend.go b/backend.go index 311f6ff..b813438 100644 --- a/backend.go +++ b/backend.go @@ -89,12 +89,19 @@ func (b *FileBackend) Reopen() error { return nil } - filename_fd, err := os.OpenFile(b.filepath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) - if err != nil { - return errors.New(fmt.Sprintf("Cannot open log file %s (%s)", b.filepath, err.Error())) - } else { - b.l = filename_fd + if c, ok := b.l.(io.Closer); ok { + if err := c.Close(); err != nil { + return err + } } + + fd, err := os.OpenFile(b.filepath, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644) + if err != nil { + return fmt.Errorf("Cannot open log file %s: %w", b.filepath, err) + } + + b.l = fd + return nil }