diff --git a/daemon/logger/jsonfilelog/jsonfilelog.go b/daemon/logger/jsonfilelog/jsonfilelog.go index e3fb98dc6b..d19f8ff299 100644 --- a/daemon/logger/jsonfilelog/jsonfilelog.go +++ b/daemon/logger/jsonfilelog/jsonfilelog.go @@ -267,7 +267,8 @@ func (l *JSONFileLogger) readLogs(logWatcher *logger.LogWatcher, config logger.R if !config.Follow { return } - if config.Tail == 0 { + + if config.Tail >= 0 { latestFile.Seek(0, os.SEEK_END) } diff --git a/daemon/logger/logger.go b/daemon/logger/logger.go index ed245fcc1d..8a2acccf6e 100644 --- a/daemon/logger/logger.go +++ b/daemon/logger/logger.go @@ -9,6 +9,7 @@ package logger import ( "errors" + "sync" "time" "github.com/docker/docker/pkg/timeutils" @@ -58,6 +59,7 @@ type LogWatcher struct { // For sending error messages that occur while while reading logs. Err chan error closeNotifier chan struct{} + closeOnce sync.Once } // NewLogWatcher returns a new LogWatcher. @@ -71,7 +73,12 @@ func NewLogWatcher() *LogWatcher { // Close notifies the underlying log reader to stop. func (w *LogWatcher) Close() { - close(w.closeNotifier) + // only close if not already closed + select { + case <-w.closeNotifier: + default: + close(w.closeNotifier) + } } // WatchClose returns a channel receiver that receives notification