Skip to content

Commit 128bc55

Browse files
committed
feat: improve logger
1 parent 87bf472 commit 128bc55

9 files changed

+79
-100
lines changed

lib/deploy/stepFunctions/compileAlarms.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ const _ = require('lodash');
44
const BbPromise = require('bluebird');
55
const Joi = require('@hapi/joi');
66
const schema = require('./compileAlarms.schema');
7-
8-
let log;
7+
const logger = require('../../utils/logger');
98

109
const cloudWatchMetricNames = {
1110
executionsTimedOut: 'ExecutionsTimedOut',
@@ -41,7 +40,7 @@ function getCloudWatchAlarms(
4140
);
4241

4342
if (!_.isEmpty(invalid)) {
44-
log(
43+
logger.log(
4544
`state machine [${stateMachineName}] : alarms.metrics has invalid metrics `,
4645
`[${invalid.join(',')}]. `
4746
+ 'No CloudWatch Alarms would be created for these. '
@@ -98,7 +97,7 @@ function validateConfig(serverless, stateMachineName, alarmsObj) {
9897
const { error } = Joi.validate(alarmsObj, schema, { allowUnknown: false });
9998

10099
if (error) {
101-
log(
100+
logger.log(
102101
`State machine [${stateMachineName}] : alarms config is malformed. `
103102
+ 'Please see https://github.com/horike37/serverless-step-functions for examples. '
104103
+ `${error}`,
@@ -111,7 +110,7 @@ function validateConfig(serverless, stateMachineName, alarmsObj) {
111110

112111
module.exports = {
113112
compileAlarms() {
114-
log = this.log;
113+
logger.config(this.serverless, this.v3Api);
115114
const cloudWatchAlarms = _.flatMap(this.getAllStateMachines(), (name) => {
116115
const stateMachineObj = this.getStateMachine(name);
117116
const stateMachineLogicalId = this.getStateMachineLogicalId(name, stateMachineObj);

lib/deploy/stepFunctions/compileIamRole.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const path = require('path');
66
const { isIntrinsic, translateLocalFunctionNames, trimAliasFromLambdaArn } = require('../../utils/aws');
77
const { getArnPartition } = require('../../utils/arn');
88

9-
let log;
9+
const logger = require('../../utils/logger');
1010

1111
function getTaskStates(states) {
1212
return _.flatMap(states, (state) => {
@@ -51,7 +51,7 @@ function sqsQueueUrlToArn(serverless, queueUrl) {
5151
// we need to use "*" as ARN
5252
return '*';
5353
}
54-
log(`Unable to parse SQS queue url [${queueUrl}]`);
54+
logger.log(`Unable to parse SQS queue url [${queueUrl}]`);
5555
return [];
5656
}
5757

@@ -64,7 +64,7 @@ function getSqsPermissions(serverless, state) {
6464
: sqsQueueUrlToArn(serverless, state.Parameters.QueueUrl);
6565
return [{ action: 'sqs:SendMessage', resource: queueArn }];
6666
}
67-
log('SQS task missing Parameters.QueueUrl or Parameters.QueueUrl.$');
67+
logger.log('SQS task missing Parameters.QueueUrl or Parameters.QueueUrl.$');
6868
return [];
6969
}
7070

@@ -75,7 +75,7 @@ function getSnsPermissions(serverless, state) {
7575
const topicArn = state.Parameters['TopicArn.$'] ? '*' : state.Parameters.TopicArn;
7676
return [{ action: 'sns:Publish', resource: topicArn }];
7777
}
78-
log('SNS task missing Parameters.TopicArn or Parameters.TopicArn.$');
78+
logger.log('SNS task missing Parameters.TopicArn or Parameters.TopicArn.$');
7979
return [];
8080
}
8181

@@ -480,7 +480,7 @@ function getIamPermissions(taskStates) {
480480
],
481481
}];
482482
}
483-
this.log('Cannot generate IAM policy statement for Task state', state);
483+
logger.log('Cannot generate IAM policy statement for Task state', state);
484484
return [];
485485
}
486486
});
@@ -507,7 +507,7 @@ function getIamStatements(iamPermissions) {
507507

508508
module.exports = {
509509
compileIamRole() {
510-
log = this.log;
510+
logger.config(this.serverless, this.v3Api);
511511
this.getAllStateMachines().forEach((stateMachineName) => {
512512
const stateMachineObj = this.getStateMachine(stateMachineName);
513513
if (stateMachineObj.role) {

lib/deploy/stepFunctions/compileNotifications.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ const Joi = require('@hapi/joi');
55
const crypto = require('crypto');
66
const BbPromise = require('bluebird');
77
const schema = require('./compileNotifications.schema');
8-
9-
let log;
8+
const logger = require('../../utils/logger');
109

1110
const executionStatuses = [
1211
'ABORTED', 'FAILED', 'RUNNING', 'SUCCEEDED', 'TIMED_OUT',
@@ -320,7 +319,7 @@ function validateConfig(serverless, stateMachineName, stateMachineObj, notificat
320319
}
321320

322321
if (stateMachineObj.type === 'EXPRESS') {
323-
log(
322+
logger.log(
324323
`State machine [${stateMachineName}] : notifications are not supported on Express Workflows. `
325324
+ 'Please see https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html for difference between Step Functions Standard and Express Workflow.',
326325
);
@@ -332,7 +331,7 @@ function validateConfig(serverless, stateMachineName, stateMachineObj, notificat
332331
);
333332

334333
if (error) {
335-
log(
334+
logger.log(
336335
`State machine [${stateMachineName}] : notifications config is malformed. `
337336
+ 'Please see https://github.com/horike37/serverless-step-functions for examples. '
338337
+ `${error}`,
@@ -345,7 +344,7 @@ function validateConfig(serverless, stateMachineName, stateMachineObj, notificat
345344

346345
module.exports = {
347346
compileNotifications() {
348-
log = this.log;
347+
logger.config(this.serverless, this.v3Api);
349348
const newResourcePairs = _.flatMap(this.getAllStateMachines(), (name) => {
350349
const stateMachineObj = this.getStateMachine(name);
351350
const stateMachineLogicalId = this.getStateMachineLogicalId(name, stateMachineObj);

lib/deploy/stepFunctions/compileStateMachines.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const BbPromise = require('bluebird');
77
const crypto = require('crypto');
88
const schema = require('./compileStateMachines.schema');
99
const { isIntrinsic, translateLocalFunctionNames, convertToFunctionVersion } = require('../../utils/aws');
10+
const logger = require('../../utils/logger');
1011

1112
function generateSubVariableName(element) {
1213
return crypto
@@ -119,7 +120,7 @@ module.exports = {
119120
if (this.serverless.service.stepFunctions.validate) {
120121
const { isValid, errorsText } = aslValidator(stateMachineObj.definition);
121122
if (isValid) {
122-
this.log(`✓ State machine "${stateMachineName}" definition is valid`);
123+
logger.log(`✓ State machine "${stateMachineName}" definition is valid`);
123124
} else {
124125
const errorMessage = [
125126
`✕ State machine "${stateMachineName}" definition is invalid:`,

lib/index.js

+9-6
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,20 @@ const invoke = require('./invoke/invoke');
2929
const yamlParser = require('./yamlParser');
3030
const naming = require('./naming');
3131

32-
const Logger = require('./utils/logger');
32+
const logger = require('./utils/logger');
3333

3434
class ServerlessStepFunctions {
3535
constructor(serverless, options, v3Api) {
3636
this.serverless = serverless;
3737
this.options = options || {};
38+
this.v3api = v3Api;
39+
3840
this.provider = this.serverless.getProvider('aws');
3941
this.service = this.serverless.service.service;
4042
this.region = this.provider.getRegion();
4143
this.stage = this.provider.getStage();
42-
this.log = new Logger(serverless, v3Api).log;
44+
45+
logger.config(serverless, v3Api);
4346
Object.assign(
4447
this,
4548
compileStateMachines,
@@ -174,17 +177,17 @@ class ServerlessStepFunctions {
174177
.then(this.startExecution)
175178
.then(this.describeExecution)
176179
.then((result) => {
177-
this.log('');
180+
logger.log('');
178181
if (result.status === 'FAILED') {
179182
return this.getExecutionHistory()
180183
.then((error) => {
181-
this.log(_.merge(result, error.events[error.events.length - 1]
184+
logger.log(_.merge(result, error.events[error.events.length - 1]
182185
.executionFailedEventDetails));
183186
process.exitCode = 1;
184187
});
185188
}
186189

187-
this.log(result);
190+
logger.log(result);
188191
return BbPromise.resolve();
189192
});
190193
}
@@ -228,7 +231,7 @@ class ServerlessStepFunctions {
228231
message += stateMachineMessages;
229232
message += '\n';
230233

231-
this.log(message);
234+
logger.log(message);
232235

233236
return message;
234237
}

lib/index.test.js

+12-10
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const AwsProvider = require('serverless/lib/plugins/aws/provider');
88
const CLI = require('serverless/lib/classes/CLI');
99
const chalk = require('chalk');
1010
const ServerlessStepFunctions = require('./index');
11+
const logger = require('./utils/logger');
1112

1213
describe('#index', () => {
1314
let serverless;
@@ -287,23 +288,24 @@ describe('#index', () => {
287288
});
288289

289290
describe('#deploy()', () => {
290-
let logStub;
291+
let logSpy;
291292

292293
beforeEach(() => {
293-
logStub = sinon.stub();
294+
logger.config(serverless);
295+
logSpy = sinon.spy(logger, 'log');
296+
serverless.cli = { consoleLog: logSpy };
294297
serverlessStepFunctions.endpointInfo = 'https://example.com';
295-
serverlessStepFunctions.log = logStub;
296298
});
297299

298300
afterEach(() => {
299-
serverlessStepFunctions.log = null;
301+
logSpy.restore();
300302
});
301303

302304
it('should not display endpoints if http event not given', () => {
303305
serverlessStepFunctions.serverless.service.stepFunctions = {};
304306
const expectedMessage = '';
305307
const message = serverlessStepFunctions.display();
306-
expect(logStub.calledOnce).to.equal(false);
308+
expect(logSpy.calledOnce).to.equal(false);
307309
expect(message).to.equal(expectedMessage);
308310
});
309311

@@ -329,7 +331,7 @@ describe('#index', () => {
329331
expectedMessage += '\n POST - https://example.com/foo/bar';
330332
expectedMessage += '\n';
331333
const message = serverlessStepFunctions.display();
332-
expect(logStub.calledOnce).to.equal(true);
334+
expect(logSpy.calledOnce).to.equal(true);
333335
expect(message).to.equal(expectedMessage);
334336
});
335337

@@ -352,7 +354,7 @@ describe('#index', () => {
352354
expectedMessage += '\n POST - https://example.com/foo/bar';
353355
expectedMessage += '\n';
354356
const message = serverlessStepFunctions.display();
355-
expect(logStub.calledOnce).to.equal(true);
357+
expect(logSpy.calledOnce).to.equal(true);
356358
expect(message).to.equal(expectedMessage);
357359
});
358360

@@ -375,7 +377,7 @@ describe('#index', () => {
375377
expectedMessage += '\n POST - https://example.com';
376378
expectedMessage += '\n';
377379
const message = serverlessStepFunctions.display();
378-
expect(logStub.calledOnce).to.equal(true);
380+
expect(logSpy.calledOnce).to.equal(true);
379381
expect(message).to.equal(expectedMessage);
380382
});
381383

@@ -390,7 +392,7 @@ describe('#index', () => {
390392
};
391393
const expectedMessage = '';
392394
const message = serverlessStepFunctions.display();
393-
expect(logStub.calledOnce).to.equal(false);
395+
expect(logSpy.calledOnce).to.equal(false);
394396
expect(message).to.equal(expectedMessage);
395397
});
396398

@@ -409,7 +411,7 @@ describe('#index', () => {
409411
};
410412
const expectedMessage = '';
411413
const message = serverlessStepFunctions.display();
412-
expect(logStub.calledOnce).to.equal(false);
414+
expect(logSpy.calledOnce).to.equal(false);
413415
expect(message).to.equal(expectedMessage);
414416
});
415417
});

lib/utils/logger.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
'use strict';
22

33
class Logger {
4-
constructor(serverless, v3Api) {
4+
config(serverless, v3Api) {
55
if (v3Api) {
66
this.log = v3Api.log;
77
} else {
88
this.log = serverless.cli && serverless.cli.consoleLog;
99
}
10+
11+
return this;
1012
}
1113
}
1214

13-
module.exports = Logger;
15+
module.exports = new Logger();

lib/utils/logger.test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
const expect = require('chai').expect;
44
const sinon = require('sinon');
55
const Serverless = require('serverless/lib/Serverless');
6-
const Logger = require('../utils/logger');
6+
const logger = require('../utils/logger');
77

88
describe('logger', () => {
99
let serverless;
@@ -22,15 +22,15 @@ describe('logger', () => {
2222
});
2323

2424
it('should be assigned legacy logger (serverless.cli.consoleLog) if v3 log api is not supplied', () => {
25-
const log = new Logger(serverless).log;
25+
const { log } = logger.config(serverless);
2626
log('Testing purpose');
2727

2828
expect(serverless.cli.consoleLog.callCount).to.equal(1);
2929
expect(v3LogSpy.callCount).to.equal(0);
3030
});
3131

3232
it('should be assigned new log API if new log api is supplied', () => {
33-
const log = new Logger(serverless, { log: v3LogSpy }).log;
33+
const { log } = logger.config(serverless, { log: v3LogSpy });
3434
log('Testing purpose');
3535

3636
expect(serverless.cli.consoleLog.callCount).to.equal(0);

0 commit comments

Comments
 (0)