diff --git a/docker/log_iterator.go b/docker/log_iterator.go index a0122e74..f1457f17 100644 --- a/docker/log_iterator.go +++ b/docker/log_iterator.go @@ -12,10 +12,10 @@ import ( ) type eventGenerator struct { - reader *bufio.Reader - channel chan *LogEvent - next *LogEvent - error error + reader *bufio.Reader + channel chan *LogEvent + next *LogEvent + lastError error } func NewEventIterator(reader *bufio.Reader) *eventGenerator { @@ -32,11 +32,8 @@ func (g *eventGenerator) Next() (*LogEvent, error) { g.next = nil nextEvent = g.Peek() } else { - event, ok := <-g.channel - if !ok { - return nil, g.error - } - currentEvent = event + currentEvent = <-g.channel + nextEvent = g.Peek() } @@ -65,11 +62,11 @@ func (g *eventGenerator) Next() (*LogEvent, error) { currentEvent.Position = END } - return currentEvent, nil + return currentEvent, g.lastError } func (g *eventGenerator) LastError() error { - return g.error + return g.lastError } func (g *eventGenerator) Peek() *LogEvent { @@ -117,7 +114,7 @@ func (g *eventGenerator) consume() { if readerError != nil { close(g.channel) - g.error = readerError + g.lastError = readerError break } } diff --git a/web/logs.go b/web/logs.go index e49a0d80..021a8769 100644 --- a/web/logs.go +++ b/web/logs.go @@ -66,12 +66,14 @@ func (h *handler) fetchLogsBetweenDates(w http.ResponseWriter, r *http.Request) for { logEvent, readerError := iterator.Next() - if readerError != nil { - break - } + if err := json.NewEncoder(w).Encode(logEvent); err != nil { log.Errorf("json encoding error while streaming %v", err.Error()) } + + if readerError != nil { + break + } } } @@ -138,9 +140,7 @@ func (h *handler) streamLogs(w http.ResponseWriter, r *http.Request) { for { logEvent, err := iterator.Next() - if err != nil { - break - } + if buf, err := json.Marshal(logEvent); err != nil { log.Errorf("json encoding error while streaming %v", err.Error()) } else { @@ -151,6 +151,9 @@ func (h *handler) streamLogs(w http.ResponseWriter, r *http.Request) { } fmt.Fprintf(w, "\n") f.Flush() + if err != nil { + break + } }