@@ -4,12 +4,16 @@ package logs
44
55import (
66 "bufio"
7+ "bytes"
78 "encoding/json"
9+ "errors"
810 "io"
911
1012 "github.com/sirupsen/logrus"
1113)
1214
15+ var fatalsSep = []byte ("; " )
16+
1317func ForwardLogs (logPipe io.ReadCloser ) chan error {
1418 done := make (chan error , 1 )
1519 s := bufio .NewScanner (logPipe )
@@ -25,24 +29,33 @@ func ForwardLogs(logPipe io.ReadCloser) chan error {
2529 }
2630
2731 go func () {
32+ fatals := []byte {}
2833 for s .Scan () {
29- processEntry (s .Bytes (), logger )
34+ fatals = processEntry (s .Bytes (), logger , fatals )
35+ }
36+ if err := s .Err (); err != nil {
37+ logrus .Errorf ("error reading from log source: %v" , err )
3038 }
3139 if err := logPipe .Close (); err != nil {
3240 logrus .Errorf ("error closing log source: %v" , err )
3341 }
34- // The only error we want to return is when reading from
35- // logPipe has failed.
36- done <- s .Err ()
42+ // The only error we return is fatal messages from runc init.
43+ var err error
44+ if len (fatals ) > 0 {
45+ err = errors .New (string (bytes .TrimSuffix (fatals , fatalsSep )))
46+ }
47+ done <- err
3748 close (done )
3849 }()
3950
4051 return done
4152}
4253
43- func processEntry (text []byte , logger * logrus.Logger ) {
54+ // processEntry parses the error and either logs it via the standard logger or,
55+ // if this is a fatal error, appends its text to fatals.
56+ func processEntry (text []byte , logger * logrus.Logger , fatals []byte ) []byte {
4457 if len (text ) == 0 {
45- return
58+ return fatals
4659 }
4760
4861 var jl struct {
@@ -51,8 +64,14 @@ func processEntry(text []byte, logger *logrus.Logger) {
5164 }
5265 if err := json .Unmarshal (text , & jl ); err != nil {
5366 logrus .Errorf ("failed to decode %q to json: %v" , text , err )
54- return
67+ return fatals
5568 }
5669
57- logger .Log (jl .Level , jl .Msg )
70+ if jl .Level == logrus .FatalLevel {
71+ fatals = append (fatals , jl .Msg ... )
72+ fatals = append (fatals , fatalsSep ... )
73+ } else {
74+ logger .Log (jl .Level , jl .Msg )
75+ }
76+ return fatals
5877}
0 commit comments