excluding directories before opening file for writing

This commit is contained in:
Diptanu Choudhury
2016-01-14 23:05:45 -08:00
parent c3a3ea102d
commit 579178720c
2 changed files with 57 additions and 0 deletions

View File

@@ -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

View File

@@ -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())
}
}