Skip to content

Commit 29fb0ad

Browse files
committed
Changing logic of container logger to color the stderr with red
1 parent eb24495 commit 29fb0ad

File tree

1 file changed

+49
-21
lines changed

1 file changed

+49
-21
lines changed

lib/ContainerLogger.js

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22

33
const Q = require('q');
4+
const chalk = require('chalk');
45
const logger = require('cf-logs').Logger('codefresh:containerLogger');
56
const CFError = require('cf-errors');
67
const LoggerStrategy = require('./enums').LoggerStrategy;
@@ -28,18 +29,26 @@ class ContainerLogger {
2829
return Q.reject(new CFError(`Strategy: ${this.loggerStrategy} is not supported`));
2930
}
3031
})
31-
.then((stream) => {
32+
.then(([stdout, stderr]) => {
33+
this._logMessageToFirebase('New logger started v8\n');
34+
3235
logger.info(`Attached stream to container: ${this.containerId}`);
3336
// Listening on the stream needs to be performed different depending if a tty is attached or not
3437
// See documentation of the docker api here: https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#/attach-to-a-container
3538
if (this.tty) {
36-
this._handleTtyStream(stream);
39+
this._handleTtyStream(stdout, false);
40+
this._handleTtyStream(stderr, true);
3741
} else {
38-
this._handleNonTtyStream(stream);
42+
this._handleNonTtyStream(stdout, false);
43+
this._handleNonTtyStream(stderr, true);
3944
}
4045

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}`);
4352
});
4453
}, (err) => {
4554
return Q.reject(new CFError({
@@ -50,47 +59,66 @@ class ContainerLogger {
5059
}
5160

5261
_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+
]);
5976
}
6077

6178
_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+
]);
6791
}
6892

69-
_handleTtyStream(stream) {
93+
_handleTtyStream(stream, isError) {
7094
stream.on('data', (chunk) => {
7195
const buf = new Buffer(chunk);
7296
const message = buf.toString('utf8');
73-
this._logMessageToFirebase(message);
97+
this._logMessageToFirebase(message, isError);
7498
});
7599
logger.info(`Listening on stream 'data' event for container: ${this.containerId}`);
76100
}
77101

78-
_handleNonTtyStream(stream) {
102+
_handleNonTtyStream(stream, isError) {
79103
stream.on('readable', () => {
80104
let header = stream.read(8);
81105
while (header !== null) {
82106
const payload = stream.read(header.readUInt32BE(4));
83107
if (payload === null) {
84108
break;
85109
}
86-
this._logMessageToFirebase(new Buffer(payload).toString('utf8'));
110+
this._logMessageToFirebase(new Buffer(payload).toString('utf8'), isError);
87111
header = stream.read(8);
88112
}
89113
});
90114
logger.info(`Listening on stream 'readable' event for container: ${this.containerId}`);
91115
}
92116

93-
_logMessageToFirebase(message) {
117+
_logMessageToFirebase(message, isError) {
118+
if (isError) {
119+
message = `\x1B[31m${message}\x1B[0m`;
120+
}
121+
94122
this.firebaseLogger.push(message);
95123
this.firebaseLastUpdate.set(new Date().getTime());
96124
}

0 commit comments

Comments
 (0)