@@ -28,18 +28,24 @@ class ContainerLogger {
28
28
return Q . reject ( new CFError ( `Strategy: ${ this . loggerStrategy } is not supported` ) ) ;
29
29
}
30
30
} )
31
- . then ( ( stream ) => {
31
+ . then ( ( [ stdout , stderr ] ) => {
32
32
logger . info ( `Attached stream to container: ${ this . containerId } ` ) ;
33
33
// Listening on the stream needs to be performed different depending if a tty is attached or not
34
34
// See documentation of the docker api here: https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/attach-to-a-container
35
35
if ( this . tty ) {
36
- this . _handleTtyStream ( stream ) ;
36
+ this . _handleTtyStream ( stdout , false ) ;
37
+ this . _handleTtyStream ( stderr , true ) ;
37
38
} else {
38
- this . _handleNonTtyStream ( stream ) ;
39
+ this . _handleNonTtyStream ( stdout , false ) ;
40
+ this . _handleNonTtyStream ( stderr , true ) ;
39
41
}
40
42
41
- stream . on ( 'end' , ( ) => {
42
- logger . info ( `stream end event was fired for container: ${ this . containerId } ` ) ;
43
+ stdout . on ( 'end' , ( ) => {
44
+ logger . info ( `stdout end event was fired for container: ${ this . containerId } ` ) ;
45
+ } ) ;
46
+
47
+ stderr . on ( 'end' , ( ) => {
48
+ logger . info ( `stderr end event was fired for container: ${ this . containerId } ` ) ;
43
49
} ) ;
44
50
} , ( err ) => {
45
51
return Q . reject ( new CFError ( {
@@ -50,47 +56,66 @@ class ContainerLogger {
50
56
}
51
57
52
58
_getAttachStrategyStream ( ) {
53
- return Q . ninvoke ( this . containerInterface , 'attach' , {
54
- stream : true ,
55
- stdout : true ,
56
- stderr : true ,
57
- tty : true
58
- } ) ;
59
+ return Q . all ( [
60
+ Q . ninvoke ( this . containerInterface , 'attach' , {
61
+ stream : true ,
62
+ stdout : true ,
63
+ stderr : false ,
64
+ tty : true
65
+ } ) ,
66
+ Q . ninvoke ( this . containerInterface , 'attach' , {
67
+ stream : true ,
68
+ stdout : false ,
69
+ stderr : true ,
70
+ tty : true
71
+ } )
72
+ ] ) ;
59
73
}
60
74
61
75
_getLogsStrategyStream ( ) {
62
- return Q . ninvoke ( this . containerInterface , 'logs' , {
63
- follow : 1 ,
64
- stdout : 1 ,
65
- stderr : 1
66
- } ) ;
76
+ return Q . all ( [
77
+ Q . ninvoke ( this . containerInterface , 'logs' , {
78
+ follow : 1 ,
79
+ stdout : 1 ,
80
+ stderr : 0
81
+ } ) ,
82
+ Q . ninvoke ( this . containerInterface , 'logs' , {
83
+ follow : 1 ,
84
+ stdout : 0 ,
85
+ stderr : 1
86
+ } )
87
+ ] ) ;
67
88
}
68
89
69
- _handleTtyStream ( stream ) {
90
+ _handleTtyStream ( stream , isError ) {
70
91
stream . on ( 'data' , ( chunk ) => {
71
92
const buf = new Buffer ( chunk ) ;
72
93
const message = buf . toString ( 'utf8' ) ;
73
- this . _logMessageToFirebase ( message ) ;
94
+ this . _logMessageToFirebase ( message , isError ) ;
74
95
} ) ;
75
96
logger . info ( `Listening on stream 'data' event for container: ${ this . containerId } ` ) ;
76
97
}
77
98
78
- _handleNonTtyStream ( stream ) {
99
+ _handleNonTtyStream ( stream , isError ) {
79
100
stream . on ( 'readable' , ( ) => {
80
101
let header = stream . read ( 8 ) ;
81
102
while ( header !== null ) {
82
103
const payload = stream . read ( header . readUInt32BE ( 4 ) ) ;
83
104
if ( payload === null ) {
84
105
break ;
85
106
}
86
- this . _logMessageToFirebase ( new Buffer ( payload ) . toString ( 'utf8' ) ) ;
107
+ this . _logMessageToFirebase ( new Buffer ( payload ) . toString ( 'utf8' ) , isError ) ;
87
108
header = stream . read ( 8 ) ;
88
109
}
89
110
} ) ;
90
111
logger . info ( `Listening on stream 'readable' event for container: ${ this . containerId } ` ) ;
91
112
}
92
113
93
- _logMessageToFirebase ( message ) {
114
+ _logMessageToFirebase ( message , isError ) {
115
+ if ( isError ) {
116
+ message = `\x1B[31m${ message } \x1B[0m` ;
117
+ }
118
+
94
119
this . firebaseLogger . push ( message ) ;
95
120
this . firebaseLastUpdate . set ( new Date ( ) . getTime ( ) ) ;
96
121
}
0 commit comments