@@ -2,6 +2,7 @@ package logger
22
33import (
44 "bufio"
5+ "bytes"
56 "io"
67 "sync"
78 "time"
@@ -40,14 +41,27 @@ func (c *Copier) Run() {
4041
4142func (c * Copier ) copySrc (name string , src io.Reader ) {
4243 defer c .copyJobs .Done ()
43- scanner := bufio .NewScanner (src )
44- for scanner .Scan () {
45- if err := c .dst .Log (& Message {ContainerID : c .cid , Line : scanner .Bytes (), Source : name , Timestamp : time .Now ().UTC ()}); err != nil {
46- logrus .Errorf ("Failed to log msg %q for logger %s: %s" , scanner .Bytes (), c .dst .Name (), err )
44+ reader := bufio .NewReader (src )
45+
46+ for {
47+ line , err := reader .ReadBytes ('\n' )
48+ line = bytes .TrimSuffix (line , []byte {'\n' })
49+
50+ // ReadBytes can return full or partial output even when it failed.
51+ // e.g. it can return a full entry and EOF.
52+ if err == nil || len (line ) > 0 {
53+ if logErr := c .dst .Log (& Message {ContainerID : c .cid , Line : line , Source : name , Timestamp : time .Now ().UTC ()}); logErr != nil {
54+ logrus .Errorf ("Failed to log msg %q for logger %s: %s" , line , c .dst .Name (), logErr )
55+ }
4756 }
48- }
49- if err := scanner .Err (); err != nil {
50- logrus .Errorf ("Error scanning log stream: %s" , err )
57+
58+ if err != nil {
59+ if err != io .EOF {
60+ logrus .Errorf ("Error scanning log stream: %s" , err )
61+ }
62+ return
63+ }
64+
5165 }
5266}
5367
0 commit comments