|
@@ -54,7 +54,6 @@ func (l *JSONFileLogger) readLogs(logWatcher *logger.LogWatcher, config logger.R
|
|
}
|
|
}
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- defer f.Close()
|
|
|
|
files = append(files, f)
|
|
files = append(files, f)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -63,15 +62,19 @@ func (l *JSONFileLogger) readLogs(logWatcher *logger.LogWatcher, config logger.R
|
|
logWatcher.Err <- err
|
|
logWatcher.Err <- err
|
|
return
|
|
return
|
|
}
|
|
}
|
|
- defer latestFile.Close()
|
|
|
|
-
|
|
|
|
- files = append(files, latestFile)
|
|
|
|
- tailer := ioutils.MultiReadSeeker(files...)
|
|
|
|
|
|
|
|
if config.Tail != 0 {
|
|
if config.Tail != 0 {
|
|
|
|
+ tailer := ioutils.MultiReadSeeker(append(files, latestFile)...)
|
|
tailFile(tailer, logWatcher, config.Tail, config.Since)
|
|
tailFile(tailer, logWatcher, config.Tail, config.Since)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // close all the rotated files
|
|
|
|
+ for _, f := range files {
|
|
|
|
+ if err := f.(io.Closer).Close(); err != nil {
|
|
|
|
+ logrus.WithField("logger", "json-file").Warnf("error closing tailed log file: %v", err)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if !config.Follow {
|
|
if !config.Follow {
|
|
return
|
|
return
|
|
}
|
|
}
|
|
@@ -129,7 +132,23 @@ func followLogs(f *os.File, logWatcher *logger.LogWatcher, notifyRotate chan int
|
|
if err != nil {
|
|
if err != nil {
|
|
logWatcher.Err <- err
|
|
logWatcher.Err <- err
|
|
}
|
|
}
|
|
- defer fileWatcher.Close()
|
|
|
|
|
|
+ defer func() {
|
|
|
|
+ f.Close()
|
|
|
|
+ fileWatcher.Close()
|
|
|
|
+ }()
|
|
|
|
+ name := f.Name()
|
|
|
|
+
|
|
|
|
+ if err := fileWatcher.Add(name); err != nil {
|
|
|
|
+ logrus.WithField("logger", "json-file").Warnf("falling back to file poller due to error: %v", err)
|
|
|
|
+ fileWatcher.Close()
|
|
|
|
+ fileWatcher = filenotify.NewPollingWatcher()
|
|
|
|
+
|
|
|
|
+ if err := fileWatcher.Add(name); err != nil {
|
|
|
|
+ logrus.Debugf("error watching log file for modifications: %v", err)
|
|
|
|
+ logWatcher.Err <- err
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
var retries int
|
|
var retries int
|
|
for {
|
|
for {
|
|
@@ -153,42 +172,42 @@ func followLogs(f *os.File, logWatcher *logger.LogWatcher, notifyRotate chan int
|
|
retries++
|
|
retries++
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
- logWatcher.Err <- err
|
|
|
|
|
|
+
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
- logrus.WithField("logger", "json-file").Debugf("waiting for events")
|
|
|
|
- if err := fileWatcher.Add(f.Name()); err != nil {
|
|
|
|
- logrus.WithField("logger", "json-file").Warn("falling back to file poller")
|
|
|
|
- fileWatcher.Close()
|
|
|
|
- fileWatcher = filenotify.NewPollingWatcher()
|
|
|
|
- if err := fileWatcher.Add(f.Name()); err != nil {
|
|
|
|
- logrus.Errorf("error watching log file for modifications: %v", err)
|
|
|
|
- logWatcher.Err <- err
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
select {
|
|
select {
|
|
case <-fileWatcher.Events():
|
|
case <-fileWatcher.Events():
|
|
dec = json.NewDecoder(f)
|
|
dec = json.NewDecoder(f)
|
|
- fileWatcher.Remove(f.Name())
|
|
|
|
continue
|
|
continue
|
|
case <-fileWatcher.Errors():
|
|
case <-fileWatcher.Errors():
|
|
- fileWatcher.Remove(f.Name())
|
|
|
|
logWatcher.Err <- err
|
|
logWatcher.Err <- err
|
|
return
|
|
return
|
|
case <-logWatcher.WatchClose():
|
|
case <-logWatcher.WatchClose():
|
|
- fileWatcher.Remove(f.Name())
|
|
|
|
|
|
+ fileWatcher.Remove(name)
|
|
return
|
|
return
|
|
case <-notifyRotate:
|
|
case <-notifyRotate:
|
|
- f, err = os.Open(f.Name())
|
|
|
|
|
|
+ f.Close()
|
|
|
|
+ fileWatcher.Remove(name)
|
|
|
|
+
|
|
|
|
+ // retry when the file doesn't exist
|
|
|
|
+ for retries := 0; retries <= 5; retries++ {
|
|
|
|
+ f, err = os.Open(name)
|
|
|
|
+ if err == nil || !os.IsNotExist(err) {
|
|
|
|
+ break
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if err = fileWatcher.Add(name); err != nil {
|
|
|
|
+ logWatcher.Err <- err
|
|
|
|
+ return
|
|
|
|
+ }
|
|
if err != nil {
|
|
if err != nil {
|
|
logWatcher.Err <- err
|
|
logWatcher.Err <- err
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
|
|
dec = json.NewDecoder(f)
|
|
dec = json.NewDecoder(f)
|
|
- fileWatcher.Remove(f.Name())
|
|
|
|
- fileWatcher.Add(f.Name())
|
|
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
}
|