Skip to content

Commit cb7a1b5

Browse files
Refactor error logger
1 parent 926c1cf commit cb7a1b5

27 files changed

+192
-186
lines changed

logger.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ class Logger {
2222
}
2323

2424
error(format, ...args) {
25+
if (args.length > 0) {
26+
const possibleError = args[args.length - 1];
27+
args[args.length - 1] = possibleError.stack || possibleError.toString();
28+
}
2529
this.logger.error(`[${this.fileName}]`, formatLogMessage(format, ...args));
2630
}
2731

server/app.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,19 @@ const LOGGER = require('../logger')('./server/app.js');
2929
if (process.env.NODE_ENV === 'production') {
3030
process.on('uncaughtException', async err => {
3131
try {
32-
LOGGER.error('An uncaught exception occurred: {}', err.stack || err.toString());
32+
LOGGER.error('An uncaught exception occurred: {}', err);
3333
await snsErrorPublisher.publish(err);
3434
} catch (publisherError) {
3535
LOGGER.error(`An error occurred when publishing info about an existing error '{}' to SNS. New error: {}`,
36-
err.name, publisherError.stack || publisherError.toString());
36+
err.name, publisherError);
3737
}
3838
});
3939

4040
process.on('unhandledRejection', async reason => {
4141
const err = reason instanceof Error || (reason && reason.name && reason.message)
4242
? reason : new Error(reason ? reason.toString() : 'An unhandled promise rejection occurred with no reason');
4343
try {
44-
LOGGER.error('An unhandled promise rejection occurred: {}', err.stack || err.toString());
44+
LOGGER.error('An unhandled promise rejection occurred: {}', err);
4545
await snsErrorPublisher.publish(err);
4646
} catch (publisherError) {
4747
LOGGER.error(`An error occurred when publishing info about an unhandled promise rejection to SNS: {}`,
@@ -58,7 +58,7 @@ mongoose.connect(process.env.MONGODB_CONNECTION_STRING, {
5858
useCreateIndex: true
5959
}, async err => {
6060
if (err) {
61-
LOGGER.error(`An error occurred when connecting to MongoDB database: {}`, err.stack || err.toString());
61+
LOGGER.error(`An error occurred when connecting to MongoDB database: {}`, err);
6262
return await snsErrorPublisher.publish(err);
6363
}
6464
LOGGER.info('Connected to MongoDB database');
@@ -234,7 +234,7 @@ app.get('/stage/:eventStageId', setXSRFTokenCookie, async (req, res) => {
234234
try {
235235
imageURL = await getThumbnail(streamKey);
236236
} catch (err) {
237-
LOGGER.info('An error occurred when getting thumbnail for stream (stream key: {}). Returning splash thumbnail. Error: {}', streamKey, err.stack || err.toString());
237+
LOGGER.info('An error occurred when getting thumbnail for stream (stream key: {}). Returning splash thumbnail. Error: {}', streamKey, err);
238238
imageURL = eventStage.getSplashThumbnailURL();
239239
}
240240
videoURL = process.env.NODE_ENV === 'production'
@@ -338,7 +338,7 @@ app.get('/user/:username/live', setXSRFTokenCookie, async (req, res) => {
338338
try {
339339
imageURL = await getThumbnail(streamKey);
340340
} catch (err) {
341-
LOGGER.info('An error occurred when getting thumbnail for stream (stream key: {}). Returning default thumbnail. Error: {}', streamKey, err.stack || err.toString());
341+
LOGGER.info('An error occurred when getting thumbnail for stream (stream key: {}). Returning default thumbnail. Error: {}', streamKey, err);
342342
imageURL = config.defaultThumbnailURL;
343343
}
344344
imageAlt = `${username} Stream Thumbnail`;
@@ -467,7 +467,7 @@ app.use(async (err, req, res, next) => {
467467
next(err); // send error to default Express error handler which prints error to console and sends 500 response
468468
} catch (publisherError) {
469469
LOGGER.error(`An error occurred when publishing info about an existing error '{}' to SNS. New error: {}`,
470-
err.name, publisherError);
470+
err.name || err.toString(), publisherError);
471471
next(publisherError);
472472
}
473473
});
@@ -506,7 +506,7 @@ process.on('SIGINT', async () => {
506506
LOGGER.info('Application shut down successfully. Exiting process with exit code 0');
507507
process.exit(0);
508508
} catch (err) {
509-
LOGGER.error('An error occurred during application shutdown. Exiting process with exit code 1. Error: {}', err.stack || err.toString());
509+
LOGGER.error('An error occurred during application shutdown. Exiting process with exit code 1. Error: {}', err);
510510
process.exit(1);
511511
}
512512
});
@@ -515,7 +515,7 @@ function closeServer() {
515515
return new Promise((resolve, reject) => {
516516
httpServer.close(err => {
517517
if (err) {
518-
LOGGER.error('An error occurred when closing HTTP server: {}', err.stack || err.toString());
518+
LOGGER.error('An error occurred when closing HTTP server: {}', err);
519519
reject(err);
520520
} else {
521521
resolve();

server/auth/passport.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ passport.use('localRegister', new Strategy(registerOptions, async (req, emailAdd
4747
try {
4848
user = await User.findOne({$or: [{email: emailLowerCase}, {username}]}).exec();
4949
} catch (err) {
50-
LOGGER.error('An error occurred during user registration: {}', err.stack || err.toString());
50+
LOGGER.error('An error occurred during user registration: {}', err);
5151
return done(err);
5252
}
5353

@@ -85,7 +85,7 @@ passport.use('localRegister', new Strategy(registerOptions, async (req, emailAdd
8585
}
8686
done(null, newUser);
8787
} catch (err) {
88-
LOGGER.error('An error occurred when saving new User: {}, Error: {}', JSON.stringify(newUser), err.stack || err.toString());
88+
LOGGER.error('An error occurred when saving new User: {}, Error: {}', JSON.stringify(newUser), err);
8989
done(err)
9090
}
9191
}));
@@ -108,7 +108,7 @@ passport.use('localLogin', new Strategy(loginOptions, async (req, usernameOrEmai
108108
}
109109
done(null, user);
110110
} catch (err) {
111-
LOGGER.error('An error occurred during user login: {}', err.stack || err.toString());
111+
LOGGER.error('An error occurred during user login: {}', err);
112112
done(err);
113113
}
114114
}));

server/aws/s3ThumbnailGenerator.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ async function checkFileExists(inputURL) {
4141
if (err.response.status === 404) {
4242
LOGGER.error('Stream file at {} does not exist', inputURL);
4343
} else {
44-
LOGGER.error('An unexpected error occurred during HEAD request to file at {}: {}',
45-
inputURL, err.stack || err.toString());
44+
LOGGER.error('An unexpected error occurred during HEAD request to file at {}: {}', inputURL, err);
4645
}
4746
throw err;
4847
}
@@ -65,8 +64,7 @@ function doGenerateStreamThumbnail({Bucket, Key, inputURL}) {
6564
LOGGER.debug('stderr: {}', data);
6665
});
6766
ffmpeg.on('error', err => {
68-
LOGGER.error('An error occurred when generating stream thumbnail (stream URL: {}): {}',
69-
inputURL, err.stack || err.toString());
67+
LOGGER.error('An error occurred when generating stream thumbnail (stream URL: {}): {}', inputURL, err);
7068
reject(err);
7169
});
7270
ffmpeg.on('close', () => {
@@ -93,7 +91,7 @@ function doGenerateStreamThumbnail({Bucket, Key, inputURL}) {
9391
})
9492
.catch(err => {
9593
LOGGER.error('An error occurred when uploading stream thumbnail to S3 (bucket: {}, key: {}): {}',
96-
Bucket, Key, err.stack || err.toString());
94+
Bucket, Key, err);
9795
reject(err);
9896
});
9997
});

server/aws/s3Utils.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ async function deleteObject({Bucket, Key}) {
1818
const deleteObjectCommand = new DeleteObjectCommand({Bucket, Key});
1919
await S3_CLIENT.send(deleteObjectCommand);
2020
} catch (err) {
21-
LOGGER.error('An error occurred when deleting object in S3 (bucket: {}, key: {}): {}',
22-
Bucket, Key, err.stack || err.toString());
21+
LOGGER.error('An error occurred when deleting object in S3 (bucket: {}, key: {}): {}', Bucket, Key, err);
2322
throw err;
2423
}
2524
}
@@ -39,7 +38,7 @@ async function createMultipartUpload({Bucket, Key}) {
3938
return response.UploadId;
4039
} catch (err) {
4140
LOGGER.error('An error occurred when creating multipart upload in S3 (bucket: {}, key: {}): {}',
42-
Bucket, Key, err.stack || err.toString());
41+
Bucket, Key, err);
4342
throw err;
4443
}
4544
}
@@ -54,7 +53,7 @@ async function getUploadPartSignedURLs({Bucket, Key, UploadId, NumberOfParts}) {
5453
return await Promise.all(promises);
5554
} catch (err) {
5655
LOGGER.error('An error occurred when signing URLs for UploadPartCommands to S3 (bucket: {}, key: {}): {}',
57-
Bucket, Key, err.stack || err.toString());
56+
Bucket, Key, err);
5857
throw err
5958
}
6059
}
@@ -67,7 +66,7 @@ async function completeMultipartUpload({Bucket, Key, UploadId, Parts}) {
6766
await S3_CLIENT.send(completeMultipartUploadCommand);
6867
} catch (err) {
6968
LOGGER.error('An error occurred when completing multipart upload in S3 (Bucket: {}, Key: {}, UploadId: {}): {}',
70-
Bucket, Key, UploadId, err.stack || err.toString());
69+
Bucket, Key, UploadId, err);
7170
throw err;
7271
}
7372
}
@@ -78,7 +77,7 @@ async function abortMultipartUpload({Bucket, Key, UploadId}) {
7877
await S3_CLIENT.send(abortMultipartUploadCommand);
7978
} catch (err) {
8079
LOGGER.error('An error occurred when aborting multipart upload in S3 (Bucket: {}, Key: {}, UploadId: {}): {}',
81-
Bucket, Key, UploadId, err.stack || err.toString());
80+
Bucket, Key, UploadId, err);
8281
throw err
8382
}
8483
}

server/aws/s3VideoUploader.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ exports.uploadVideoToS3 = ({inputURL, Bucket, Key}) => {
2222
LOGGER.debug('stderr: {}', data)
2323
});
2424
ffmpeg.on('error', err => {
25-
LOGGER.error('An error occurred when adding moov atom to recorded stream {}: {}', inputURL, err.stack || err.toString());
25+
LOGGER.error('An error occurred when adding moov atom to recorded stream {}: {}', inputURL, err);
2626
reject(err);
2727
});
2828
ffmpeg.on('close', async code => {
@@ -32,7 +32,7 @@ exports.uploadVideoToS3 = ({inputURL, Bucket, Key}) => {
3232

3333
const Body = fs.createReadStream(outputURL);
3434
Body.on('error', err => {
35-
LOGGER.error('An error occurred when opening read stream at {}: {}', outputURL, err.stack || err.toString());
35+
LOGGER.error('An error occurred when opening read stream at {}: {}', outputURL, err);
3636
reject(err);
3737
});
3838

@@ -57,7 +57,8 @@ exports.uploadVideoToS3 = ({inputURL, Bucket, Key}) => {
5757
}
5858
});
5959
} catch (err) {
60-
LOGGER.error('An error occurred when uploading recorded stream to S3 (bucket: {}, key: {}): {}', Bucket, Key, err.stack || err.toString());
60+
LOGGER.error('An error occurred when uploading recorded stream to S3 (bucket: {}, key: {}): {}',
61+
Bucket, Key, err);
6162
reject(err);
6263
}
6364
}

server/aws/sesEmailSender.js

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ module.exports.notifyUserOfNewSubscribers = async (user, subscribers) => {
3232
await SES_CLIENT.send(params);
3333
LOGGER.debug(`Successfully sent 'newSubscriber' email to {} using SES`, user.email);
3434
} catch (err) {
35-
LOGGER.error(`An error occurred when sending 'newSubscriber' email to {} using SES: {}`,
36-
user.email, err.stack || err.toString());
35+
LOGGER.error(`An error occurred when sending 'newSubscriber' email to {} using SES: {}`, user.email, err);
3736
await snsErrorPublisher.publish(err);
3837
}
3938
}
@@ -67,15 +66,14 @@ module.exports.notifySubscribersUserWentLive = async user => {
6766
await SES_CLIENT.send(params);
6867
LOGGER.debug(`Successfully sent bulk '{}' email {} using SES`, i + 1, emailType);
6968
} catch (err) {
70-
LOGGER.error(`An error occurred when sending bulk '{}' email {} using SES: {}`,
71-
i + 1, emailType, err.stack || err.toString());
69+
LOGGER.error(`An error occurred when sending bulk '{}' email {} using SES: {}`, i + 1, emailType, err);
7270
errors.push(err);
7371
}
7472
}
7573
if (errors.length) {
7674
const err = new CompositeError(errors);
7775
LOGGER.error(`{} out of {} bulk '{}' email{} failed to send. Error: {}`,
78-
errors.length, splits.length, emailType, sIfMultipleSplits, err.stack || err.toString());
76+
errors.length, splits.length, emailType, sIfMultipleSplits, err);
7977
await snsErrorPublisher.publish(err);
8078
}
8179
}
@@ -142,7 +140,7 @@ module.exports.notifyUserSubscriptionsCreatedScheduledStreams = async (user, str
142140
LOGGER.debug(`Successfully sent 'subscriptionsCreatedScheduledStreams' email to {} using SES`, user.email);
143141
} catch (err) {
144142
LOGGER.error(`An error occurred when sending 'subscriptionsCreatedScheduledStreams' email to {} using SES: {}`,
145-
user.email, err.stack || err.toString());
143+
user.email, err);
146144
await snsErrorPublisher.publish(err);
147145
}
148146
}
@@ -181,7 +179,7 @@ module.exports.notifyUserOfSubscriptionsStreamsStartingSoon = async (user, strea
181179
LOGGER.debug(`Successfully sent 'subscriptionScheduledStreamStartingIn' email to {} using SES`, user.email);
182180
} catch (err) {
183181
LOGGER.error(`An error occurred when sending 'subscriptionScheduledStreamStartingIn' email to {} using SES: {}`,
184-
user.email, err.stack || err.toString());
182+
user.email, err);
185183
await snsErrorPublisher.publish(err);
186184
}
187185
}
@@ -216,8 +214,7 @@ module.exports.sendResetPasswordEmail = async (user, token) => {
216214
await SES_CLIENT.send(params);
217215
LOGGER.debug(`Successfully sent 'resetPassword' email to {} using SES`, user.email);
218216
} catch (err) {
219-
LOGGER.error(`An error occurred when sending 'resetPassword' email to {} using SES: {}`,
220-
user.email, err.stack || err.toString());
217+
LOGGER.error(`An error occurred when sending 'resetPassword' email to {} using SES: {}`, user.email, err);
221218
await snsErrorPublisher.publish(err);
222219
}
223220
}
@@ -235,8 +232,7 @@ module.exports.sendWelcomeEmail = async (email, username) => {
235232
await SES_CLIENT.send(params);
236233
LOGGER.debug(`Successfully sent 'resetPassword' email to {} using SES`, email);
237234
} catch (err) {
238-
LOGGER.error(`An error occurred when sending 'welcomeNewUser' email to {} using SES: {}`,
239-
email, err.stack || err.toString());
235+
LOGGER.error(`An error occurred when sending 'welcomeNewUser' email to {} using SES: {}`, email, err);
240236
await snsErrorPublisher.publish(err);
241237
}
242238
}

server/cron/createdScheduledStreamsEmailer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ const job = new CronJob(cronTime.createdScheduledStreamsEmailer, async () => {
6666
}
6767
} catch (err) {
6868
LOGGER.error('An error occurred when creating requests to email users about newly created scheduled streams from subscriptions: {}',
69-
err.stack || err.toString());
69+
err);
7070
await snsErrorPublisher.publish(err);
7171
}
7272
}

server/cron/eventChatManager.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const job = new CronJob(cronTime.eventChatManager, async () => {
2424
const rejectedPromises = promiseResults.filter(res => res.status === 'rejected');
2525
if (rejectedPromises.length) {
2626
const err = new CompositeError(rejectedPromises.map(promise => promise.reason));
27-
LOGGER.error('Errors occurred when opening/closing/alerting event chats: {}', err.stack || err.toString());
27+
LOGGER.error('Errors occurred when opening/closing/alerting event chats: {}', err);
2828
await snsErrorPublisher.publish(err);
2929
}
3030

@@ -43,7 +43,7 @@ async function openChats(thisTimeTriggered) {
4343
]
4444
}).select('_id').exec();
4545
} catch (err) {
46-
LOGGER.error('An error occurred when getting events whose chats need to be opened: {}', err.stack || err.toString());
46+
LOGGER.error('An error occurred when getting events whose chats need to be opened: {}', err);
4747
throw err;
4848
}
4949

@@ -61,7 +61,7 @@ async function closeChats(thisTimeTriggered) {
6161
]
6262
}).select('_id').exec();
6363
} catch (err) {
64-
LOGGER.error('An error occurred when getting events whose chats need to be closed: {}', err.stack || err.toString());
64+
LOGGER.error('An error occurred when getting events whose chats need to be closed: {}', err);
6565
throw err;
6666
}
6767

@@ -79,7 +79,7 @@ async function sendClosureAlerts(thisTimeTriggered) {
7979
const rejectedPromises = promiseResults.filter(res => res.status === 'rejected');
8080
if (rejectedPromises.length) {
8181
const err = new CompositeError(rejectedPromises.map(promise => promise.reason));
82-
LOGGER.error('Errors occurred when sending alerts to event chats about imminent closure: {}', err.stack || err.toString());
82+
LOGGER.error('Errors occurred when sending alerts to event chats about imminent closure: {}', err);
8383
throw err;
8484
}
8585
}

server/cron/expiredScheduledStreamsRemover.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const job = new CronJob(cronTime.expiredScheduledStreamsRemover, async () => {
5757
}
5858
}
5959
} catch (err) {
60-
LOGGER.error('An error occurred when deleting ScheduledStreams past their TTL from database: {}', err.stack || err.toString());
60+
LOGGER.error('An error occurred when deleting ScheduledStreams past their TTL from database: {}', err);
6161
await snsErrorPublisher.publish(err);
6262
}
6363

server/cron/newSubscribersEmailer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ const job = new CronJob(cronTime.newSubscribersEmailer, async () => {
6969
}
7070
}
7171
} catch (err) {
72-
LOGGER.error('An error occurred when creating requests to email users about new subscribers: {}', err.stack || err.toString());
72+
LOGGER.error('An error occurred when creating requests to email users about new subscribers: {}', err);
7373
await snsErrorPublisher.publish(err);
7474
}
7575
}

server/cron/streamScheduler.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const job = new CronJob(cronTime.streamScheduler, async () => {
5858
.exec();
5959
} catch (err) {
6060
LOGGER.error('An error occurred when finding scheduled streams starting between {} and {}: {}',
61-
lastTimeTriggered, thisTimeTriggered, err.stack || err.toString());
61+
lastTimeTriggered, thisTimeTriggered, err);
6262

6363
lastTimeTriggered = thisTimeTriggered;
6464
return await snsErrorPublisher.publish(err);
@@ -113,7 +113,7 @@ const job = new CronJob(cronTime.streamScheduler, async () => {
113113
if (rejectedPromises.length) {
114114
const err = new CompositeError(rejectedPromises.map(promise => promise.reason));
115115
LOGGER.error('{} error{} occurred when updating user/stage stream info from scheduled streams. Error: {}',
116-
err.errors.length, err.errors.length === 1 ? '' : 's', err.stack || err.toString());
116+
err.errors.length, err.errors.length === 1 ? '' : 's', err);
117117
lastTimeTriggered = thisTimeTriggered;
118118
return await snsErrorPublisher.publish(err);
119119
}

server/cron/upcomingScheduledStreamEmailer.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const job = new CronJob(cronTime.upcomingScheduledStreamEmailer, async () => {
2929
})
3030
.exec();
3131
} catch (err) {
32-
LOGGER.error('An error occurred when finding users to email about streams starting soon: {}', err.stack || err.toString());
32+
LOGGER.error('An error occurred when finding users to email about streams starting soon: {}', err);
3333
return await snsErrorPublisher.publish(err);
3434
}
3535

@@ -97,7 +97,7 @@ const job = new CronJob(cronTime.upcomingScheduledStreamEmailer, async () => {
9797
if (errors.length) {
9898
const err = new CompositeError(errors);
9999
LOGGER.error('{} error{} occurred when emailing users about streams starting soon. Error: {}',
100-
errors.length, errors.length === 1 ? '' : 's', err.stack || err.toString());
100+
errors.length, errors.length === 1 ? '' : 's', err);
101101
await snsErrorPublisher.publish(err);
102102
}
103103
}

0 commit comments

Comments
 (0)