diff --git a/client/driver/logs.go b/client/driver/logs.go index ba2b81cd6..ecaf38bfc 100644 --- a/client/driver/logs.go +++ b/client/driver/logs.go @@ -27,6 +27,10 @@ func NewLogRotator(path string, fileName string, maxFiles int, fileSize int64) ( logFileIdx := 0 for _, f := range files { if strings.HasPrefix(f.Name(), fileName) { + if f.IsDir() { + logFileIdx += 1 + continue + } fileIdx := strings.TrimPrefix(f.Name(), fmt.Sprintf("%s.", fileName)) n, err := strconv.Atoi(fileIdx) if err != nil { @@ -51,6 +55,12 @@ func (l *LogRotator) Start(r io.Reader) error { buf := make([]byte, 32*1024) for { logFileName := filepath.Join(l.path, fmt.Sprintf("%s.%d", l.fileName, l.logFileIdx)) + if f, err := os.Stat(logFileName); err == nil { + if f.IsDir() { + l.logFileIdx += 1 + continue + } + } f, err := os.OpenFile(logFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { return err diff --git a/client/driver/logs_test.go b/client/driver/logs_test.go index 03140116e..f8e50533c 100644 --- a/client/driver/logs_test.go +++ b/client/driver/logs_test.go @@ -152,3 +152,50 @@ func TestLogRotator_StartFromEmptyDir(t *testing.T) { } } + +func TestLogRotator_SetPathAsFile(t *testing.T) { + path := "/tmp/tmplogrator" + defer os.RemoveAll(path) + if _, err := os.Create(path); err != nil { + t.Fatalf("test setup problem: %v", err) + } + + _, err := NewLogRotator(path, "redis.stdout", 10, 10) + if err == nil { + t.Fatal("expected error") + } +} + +func TestLogRotator_ExcludeDirs(t *testing.T) { + path := "/tmp/tmplogrator" + defer os.RemoveAll(path) + if err := os.Mkdir(path, os.ModeDir|os.ModePerm); err != nil { + t.Fatalf("test setup err: %v", err) + } + if err := os.Mkdir(filepath.Join(path, "redis.stdout.0"), os.ModeDir|os.ModePerm); err != nil { + t.Fatalf("test setup err: %v", err) + } + + l, err := NewLogRotator(path, "redis.stdout", 10, 6) + if err != nil { + t.Fatalf("test setup err: %v", err) + } + + r, w := io.Pipe() + go func() { + w.Write([]byte("fg")) + w.Close() + }() + err = l.Start(r) + if err != nil && err != io.EOF { + t.Fatalf("Failure in logrotator start %v", err) + } + + finfo, err := os.Stat("/tmp/tmplogrator/redis.stdout.1") + if err != nil { + t.Fatal("expected rotator to create redis.stdout.1") + } + if finfo.Size() != 2 { + t.Fatalf("expected size: %v, actual: %v", 2, finfo.Size()) + } +}