diff --git a/internal/rotate/file_writer.go b/internal/rotate/file_writer.go index 03f837f93..a167b7cb7 100644 --- a/internal/rotate/file_writer.go +++ b/internal/rotate/file_writer.go @@ -120,6 +120,11 @@ func (w *FileWriter) openCurrent() (err error) { // With time.now() as a reference we'd never rotate the file. if fileInfo, err := w.current.Stat(); err == nil { w.expireTime = fileInfo.ModTime().Add(w.interval) + w.bytesWritten = fileInfo.Size() + } + + if err = w.rotateIfNeeded(); err != nil { + return err } return nil } diff --git a/internal/rotate/file_writer_test.go b/internal/rotate/file_writer_test.go index 88ba94b9d..ca29b9a2f 100644 --- a/internal/rotate/file_writer_test.go +++ b/internal/rotate/file_writer_test.go @@ -43,6 +43,22 @@ func TestFileWriter_TimeRotation(t *testing.T) { assert.Equal(t, 2, len(files)) } +func TestFileWriter_ReopenTimeRotation(t *testing.T) { + tempDir, err := ioutil.TempDir("", "RotationTime") + require.NoError(t, err) + interval, _ := time.ParseDuration("1s") + filePath := filepath.Join(tempDir, "test.log") + err = ioutil.WriteFile(filePath, []byte("Hello World"), 0644) + time.Sleep(1 * time.Second) + assert.NoError(t, err) + writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), interval, 0, -1) + require.NoError(t, err) + defer func() { writer.Close(); os.RemoveAll(tempDir) }() + + files, _ := ioutil.ReadDir(tempDir) + assert.Equal(t, 2, len(files)) +} + func TestFileWriter_SizeRotation(t *testing.T) { tempDir, err := ioutil.TempDir("", "RotationSize") require.NoError(t, err) @@ -59,6 +75,23 @@ func TestFileWriter_SizeRotation(t *testing.T) { assert.Equal(t, 2, len(files)) } +func TestFileWriter_ReopenSizeRotation(t *testing.T) { + tempDir, err := ioutil.TempDir("", "RotationSize") + require.NoError(t, err) + maxSize := int64(12) + filePath := filepath.Join(tempDir, "test.log") + err = ioutil.WriteFile(filePath, []byte("Hello World"), 0644) + assert.NoError(t, err) + writer, err := NewFileWriter(filepath.Join(tempDir, "test.log"), 0, maxSize, -1) + require.NoError(t, err) + defer func() { writer.Close(); os.RemoveAll(tempDir) }() + + _, err = writer.Write([]byte("Hello World Again")) + require.NoError(t, err) + files, _ := ioutil.ReadDir(tempDir) + assert.Equal(t, 2, len(files)) +} + func TestFileWriter_DeleteArchives(t *testing.T) { tempDir, err := ioutil.TempDir("", "RotationDeleteArchives") require.NoError(t, err)