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