Skip to content

Commit f29a04e

Browse files
authored
chore: Logging (RocketChat#37956)
1 parent 108f7f5 commit f29a04e

10 files changed

Lines changed: 75 additions & 54 deletions

File tree

apps/meteor/app/api/server/helpers/parseJsonQuery.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,12 @@ export async function parseJsonQuery(api: GenericRouteExecutionContext): Promise
4343
}
4444
});
4545
} catch (e) {
46-
logger.warn(`Invalid sort parameter provided "${params.sort}":`, e);
47-
throw new Meteor.Error('error-invalid-sort', `Invalid sort parameter provided: "${params.sort}"`, {
46+
logger.warn({
47+
msg: 'Invalid sort parameter provided',
48+
sort: params.sort,
49+
err: e,
50+
});
51+
throw new Meteor.Error('error-invalid-sort', `Invalid sort parameter provided: \"${params.sort}\"`, {
4852
helperMethod: 'parseJsonQuery',
4953
});
5054
}
@@ -67,8 +71,12 @@ export async function parseJsonQuery(api: GenericRouteExecutionContext): Promise
6771
}
6872
});
6973
} catch (e) {
70-
logger.warn(`Invalid fields parameter provided "${params.fields}":`, e);
71-
throw new Meteor.Error('error-invalid-fields', `Invalid fields parameter provided: "${params.fields}"`, {
74+
logger.warn({
75+
msg: 'Invalid fields parameter provided',
76+
fields: params.fields,
77+
err: e,
78+
});
79+
throw new Meteor.Error('error-invalid-fields', `Invalid fields parameter provided: \"${params.fields}\"`, {
7280
helperMethod: 'parseJsonQuery',
7381
});
7482
}
@@ -111,8 +119,12 @@ export async function parseJsonQuery(api: GenericRouteExecutionContext): Promise
111119
query = ejson.parse(params.query);
112120
query = clean(query, pathAllowConf.def);
113121
} catch (e) {
114-
logger.warn(`Invalid query parameter provided "${params.query}":`, e);
115-
throw new Meteor.Error('error-invalid-query', `Invalid query parameter provided: "${params.query}"`, {
122+
logger.warn({
123+
msg: 'Invalid query parameter provided',
124+
query: params.query,
125+
err: e,
126+
});
127+
throw new Meteor.Error('error-invalid-query', `Invalid query parameter provided: \"${params.query}\"`, {
116128
helperMethod: 'parseJsonQuery',
117129
});
118130
}

apps/meteor/app/cors/server/cors.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,7 @@ WebApp.httpServer.addListener('request', (req, res, ...args) => {
169169
// @ts-expect-error - `pair` is valid, but doesnt exists on types
170170
const isSsl = req.connection.pair || (req.headers['x-forwarded-proto'] && req.headers['x-forwarded-proto'].indexOf('https') !== -1);
171171

172-
logger.debug('req.url', req.url);
173-
logger.debug('remoteAddress', remoteAddress);
174-
logger.debug('isLocal', isLocal);
175-
logger.debug('isSsl', isSsl);
176-
logger.debug('req.headers', req.headers);
172+
logger.debug({ msg: 'CORS request info', url: req.url, remoteAddress, isLocal, isSsl, headers: req.headers });
177173

178174
if (!isLocal && !isSsl) {
179175
let host = req.headers.host || url.parse(Meteor.absoluteUrl()).hostname || '';

apps/meteor/app/crowd/server/crowd.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ function fallbackDefaultAccountSystem(bind: typeof Accounts, username: string |
2525
}
2626
}
2727

28-
logger.info('Fallback to default account system', username);
28+
logger.info({ msg: 'Fallback to default account system', username });
2929

3030
const loginRequest = {
3131
user: username,
@@ -125,7 +125,7 @@ export class CROWD {
125125
if (user) {
126126
crowdUsername = user.crowd_username;
127127
} else {
128-
logger.debug('Could not find a user by email', username);
128+
logger.debug({ msg: 'Could not find a user by email', username });
129129
}
130130
}
131131

@@ -143,7 +143,7 @@ export class CROWD {
143143
if (user) {
144144
crowdUsername = user.crowd_username;
145145
} else {
146-
logger.debug('Could not find a user with by crowd_username', username);
146+
logger.debug({ msg: 'Could not find a user with by crowd_username', username });
147147
}
148148
}
149149

@@ -157,7 +157,7 @@ export class CROWD {
157157
if (!user && crowdUsername) {
158158
logger.debug('New user. User is not synced yet.');
159159
}
160-
logger.debug('Going to crowd:', crowdUsername);
160+
logger.debug({ msg: 'Going to crowd', crowdUsername });
161161

162162
return new Promise((resolve, reject) =>
163163
this.crowdClient.user.authenticate(crowdUsername, password, async (err: any, res: Record<string, any>) => {
@@ -241,9 +241,9 @@ export class CROWD {
241241

242242
for await (const user of users) {
243243
let crowdUsername = user.hasOwnProperty('crowd_username') ? user.crowd_username : user.username;
244-
logger.info('Syncing user', crowdUsername);
244+
logger.info({ msg: 'Syncing user', crowdUsername });
245245
if (!crowdUsername) {
246-
logger.warn('User has no crowd_username', user.username);
246+
logger.warn({ msg: 'User has no crowd_username', username: user.username });
247247
continue;
248248
}
249249

@@ -252,28 +252,28 @@ export class CROWD {
252252
try {
253253
crowdUser = await this.fetchCrowdUser(crowdUsername);
254254
} catch (err) {
255-
logger.debug({ err });
255+
logger.debug({ msg: 'Error while syncing user from CROWD', err });
256256
logger.error({ msg: 'Could not sync user with username', crowd_username: crowdUsername });
257257

258258
const email = user.emails?.[0].address;
259-
logger.info('Attempting to find for user by email', email);
259+
logger.info({ msg: 'Attempting to find user by email', email });
260260

261261
const response = await this.searchForCrowdUserByMail(email);
262262
if (!response || response.users.length === 0) {
263-
logger.warn('Could not find user in CROWD with username or email:', crowdUsername, email);
263+
logger.warn({ msg: 'Could not find user in CROWD with username or email', crowd_username: crowdUsername, email });
264264
if (settings.get('CROWD_Remove_Orphaned_Users') === true) {
265-
logger.info('Removing user:', crowdUsername);
265+
logger.info({ msg: 'Removing user', crowd_username: crowdUsername });
266266
setImmediate(async () => {
267267
await deleteUser(user._id);
268-
logger.info('User removed:', crowdUsername);
268+
logger.info({ msg: 'User removed', crowd_username: crowdUsername });
269269
});
270270
}
271271
return;
272272
}
273273
crowdUsername = response.users[0].name;
274-
logger.info('User found by email. Syncing user', crowdUsername);
274+
logger.info({ msg: 'User found by email. Syncing user', crowd_username: crowdUsername });
275275
if (!crowdUsername) {
276-
logger.warn('User has no crowd_username', user.username);
276+
logger.warn({ msg: 'User has no crowd_username', username: user.username });
277277
continue;
278278
}
279279

@@ -368,7 +368,7 @@ Accounts.registerLoginHandler('crowd', async function (this: typeof Accounts, lo
368368
return undefined;
369369
}
370370

371-
logger.info('Init CROWD login', loginRequest.username);
371+
logger.info({ msg: 'Init CROWD login', username: loginRequest.username });
372372

373373
if (settings.get('CROWD_Enable') !== true) {
374374
return fallbackDefaultAccountSystem(this, loginRequest.username, loginRequest.crowdPassword);
@@ -379,12 +379,12 @@ Accounts.registerLoginHandler('crowd', async function (this: typeof Accounts, lo
379379
const user = await crowd.authenticate(loginRequest.username, loginRequest.crowdPassword);
380380

381381
if (user && user.crowd === false) {
382-
logger.debug(`User ${loginRequest.username} is not a valid crowd user, falling back`);
382+
logger.debug({ msg: 'User is not a valid crowd user, falling back', username: loginRequest.username });
383383
return fallbackDefaultAccountSystem(this, loginRequest.username, loginRequest.crowdPassword);
384384
}
385385

386386
if (!user) {
387-
logger.debug(`User ${loginRequest.username} is not allowed to access Rocket.Chat`);
387+
logger.debug({ msg: 'User is not allowed to access Rocket.Chat', username: loginRequest.username });
388388
return new Meteor.Error('not-authorized', 'User is not authorized by crowd');
389389
}
390390

apps/meteor/app/importer-csv/server/CsvImporter.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export class CsvImporter extends Importer {
4040
oldRate = rate;
4141
}
4242
} catch (e) {
43-
this.logger.error(e);
43+
this.logger.error({ msg: 'Error while increasing CSV import progress', err: e });
4444
}
4545
};
4646

@@ -66,18 +66,18 @@ export class CsvImporter extends Importer {
6666
};
6767

6868
for await (const entry of zip.getEntries()) {
69-
this.logger.debug(`Entry: ${entry.entryName}`);
69+
this.logger.debug({ msg: 'Entry', entryName: entry.entryName });
7070

7171
// Ignore anything that has `__MACOSX` in it's name, as sadly these things seem to mess everything up
7272
if (entry.entryName.indexOf('__MACOSX') > -1) {
73-
this.logger.debug(`Ignoring the file: ${entry.entryName}`);
73+
this.logger.debug({ msg: 'Ignoring the file', entryName: entry.entryName });
7474
increaseProgressCount();
7575
continue;
7676
}
7777

7878
// Directories are ignored, since they are "virtual" in a zip file
7979
if (entry.isDirectory) {
80-
this.logger.debug(`Ignoring the directory entry: ${entry.entryName}`);
80+
this.logger.debug({ msg: 'Ignoring the directory entry', entryName: entry.entryName });
8181
increaseProgressCount();
8282
continue;
8383
}
@@ -168,7 +168,7 @@ export class CsvImporter extends Importer {
168168
try {
169169
msgs = this.csvParser(entry.getData().toString());
170170
} catch (e) {
171-
this.logger.warn(`The file ${entry.entryName} contains invalid syntax`, e);
171+
this.logger.warn({ msg: 'The file contains invalid syntax', entryName: entry.entryName, err: e });
172172
increaseProgressCount();
173173
continue;
174174
}
@@ -277,7 +277,7 @@ export class CsvImporter extends Importer {
277277

278278
// Ensure we have at least a single record of any kind
279279
if (usersCount === 0 && channelsCount === 0 && messagesCount === 0 && contactsCount === 0) {
280-
this.logger.error('No valid record found in the import file.');
280+
this.logger.error({ msg: 'No valid record found in the import file.' });
281281
await super.updateProgress(ProgressStep.ERROR);
282282
}
283283

apps/meteor/app/importer-pending-avatars/server/PendingAvatarImporter.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { setAvatarFromServiceWithValidation } from '../../lib/server/functions/s
77

88
export class PendingAvatarImporter extends Importer {
99
async prepareFileCount() {
10-
this.logger.debug('start preparing import operation');
10+
this.logger.debug({ msg: 'start preparing import operation' });
1111
await super.updateProgress(ProgressStep.PREPARING_STARTED);
1212

1313
const fileCount = await Users.countAllUsersWithPendingAvatar();
@@ -49,13 +49,13 @@ export class PendingAvatarImporter extends Importer {
4949
await setAvatarFromServiceWithValidation(_id, url, undefined, 'url');
5050
await Users.updateOne({ _id }, { $unset: { _pendingAvatarUrl: '' } });
5151
} catch (error) {
52-
this.logger.warn(`Failed to set ${name}'s avatar from url ${url}`);
52+
this.logger.warn({ msg: 'Failed to set user avatar from pending URL', name, url });
5353
}
5454
} finally {
5555
await this.addCountCompleted(1);
5656
}
5757
} catch (error) {
58-
this.logger.error(error);
58+
this.logger.error({ msg: 'Failed to process pending avatar for user', err: error });
5959
}
6060
}
6161
} catch (error) {

apps/meteor/app/importer-slack/server/SlackImporter.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ export class SlackImporter extends Importer {
125125
(channel): channel is SlackChannel & { creator: string } => 'creator' in channel && channel.creator != null,
126126
);
127127

128-
this.logger.debug(`loaded ${data.length} channels.`);
128+
this.logger.debug({ msg: 'loaded channels', count: data.length });
129129

130130
await this.addCountToTotal(data.length);
131131

@@ -155,7 +155,7 @@ export class SlackImporter extends Importer {
155155
(channel): channel is SlackChannel & { creator: string } => 'creator' in channel && channel.creator != null,
156156
);
157157

158-
this.logger.debug(`loaded ${data.length} groups.`);
158+
this.logger.debug({ msg: 'loaded groups', count: data.length });
159159

160160
await this.addCountToTotal(data.length);
161161

@@ -184,7 +184,7 @@ export class SlackImporter extends Importer {
184184
(channel): channel is SlackChannel & { creator: string } => 'creator' in channel && channel.creator != null,
185185
);
186186

187-
this.logger.debug(`loaded ${data.length} mpims.`);
187+
this.logger.debug({ msg: 'loaded mpims', count: data.length });
188188

189189
await this.addCountToTotal(data.length);
190190

@@ -213,7 +213,7 @@ export class SlackImporter extends Importer {
213213
await super.updateProgress(ProgressStep.PREPARING_CHANNELS);
214214
const data = JSON.parse(entry.getData().toString()) as SlackChannel[];
215215

216-
this.logger.debug(`loaded ${data.length} dms.`);
216+
this.logger.debug({ msg: 'loaded dms', count: data.length });
217217

218218
await this.addCountToTotal(data.length);
219219
for await (const channel of data) {
@@ -232,7 +232,7 @@ export class SlackImporter extends Importer {
232232
await super.updateProgress(ProgressStep.PREPARING_USERS);
233233
const data = JSON.parse(entry.getData().toString()) as SlackUser[];
234234

235-
this.logger.debug(`loaded ${data.length} users.`);
235+
this.logger.debug({ msg: 'loaded users', count: data.length });
236236

237237
// Insert the users record
238238
await this.updateRecord({ 'count.users': data.length });
@@ -352,7 +352,7 @@ export class SlackImporter extends Importer {
352352
try {
353353
if (entry.entryName.includes('__MACOSX') || entry.entryName.includes('.DS_Store')) {
354354
count++;
355-
this.logger.debug(`Ignoring the file: ${entry.entryName}`);
355+
this.logger.debug({ msg: 'Ignoring the file', entryName: entry.entryName });
356356
continue;
357357
}
358358

@@ -385,7 +385,7 @@ export class SlackImporter extends Importer {
385385
}
386386
}
387387
} catch (error) {
388-
this.logger.warn(`${entry.entryName} is not a valid JSON file! Unable to import it.`);
388+
this.logger.warn({ msg: 'Entry is not a valid JSON file; unable to import', entryName: entry.entryName, err: error });
389389
}
390390
}
391391
} catch (e) {
@@ -626,7 +626,10 @@ export class SlackImporter extends Importer {
626626
newMessage.replies = Array.from(replies);
627627
}
628628
} else {
629-
this.logger.warn(`Failed to import the parent comment, message: ${newMessage._id}. Missing replies/reply_users field`);
629+
this.logger.warn({
630+
msg: 'Failed to import the parent comment; missing replies/reply_users field',
631+
messageId: newMessage._id,
632+
});
630633
}
631634

632635
newMessage.tcount = message.reply_count;

apps/meteor/app/importer/server/classes/Importer.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export class Importer {
7171
this._lastProgressReportTotal = 0;
7272
this.reloadCount();
7373

74-
this.logger.debug(`Constructed a new ${this.info.name} Importer.`);
74+
this.logger.debug({ msg: 'Constructed a new Importer.', importerName: this.info.name });
7575
}
7676

7777
/**
@@ -220,14 +220,14 @@ export class Importer {
220220

221221
await this.updateProgress(ProgressStep.DONE);
222222
} catch (e) {
223-
this.logger.error(e);
223+
this.logger.error({ msg: 'Importer encountered an error during import', err: e });
224224
await this.updateProgress(ProgressStep.ERROR);
225225
} finally {
226226
await this.applySettingValues(this.oldSettings);
227227
}
228228

229229
const timeTook = Date.now() - started;
230-
this.logger.log(`Import took ${timeTook} milliseconds.`);
230+
this.logger.log({ msg: 'Import completed', durationMs: timeTook });
231231
});
232232

233233
return this.getProgress();
@@ -279,7 +279,7 @@ export class Importer {
279279
async updateProgress(step: IImportProgress['step']): Promise<ImporterProgress> {
280280
this.progress.step = step;
281281

282-
this.logger.debug(`${this.info.name} is now at ${step}.`);
282+
this.logger.debug({ msg: 'Importer progress step updated', importerName: this.info.name, step });
283283
await this.updateRecord({ status: this.progress.step });
284284

285285
// Do not send the default progress report during the preparing stage - the classes are sending their own report in a different format.
@@ -343,7 +343,11 @@ export class Importer {
343343
}, 250);
344344
}
345345

346-
this.logger.log(`${this.progress.count.completed} records imported, ${this.progress.count.error} failed`);
346+
this.logger.log({
347+
msg: 'Import progress update',
348+
completed: this.progress.count.completed,
349+
failed: this.progress.count.error,
350+
});
347351

348352
return this.progress;
349353
}

apps/meteor/app/importer/server/classes/converters/RecordConverter.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,11 @@ export class RecordConverter<R extends IImportRecord, T extends RecordConverterO
108108
}
109109

110110
protected async saveError(importId: string, error: Error): Promise<void> {
111-
this._logger.error(error);
111+
this._logger.error({
112+
msg: 'Import record conversion failed',
113+
importId,
114+
err: error,
115+
});
112116
this.saveErrorToMemory(importId, error);
113117

114118
if (!this._converterOptions.workInMemory) {

apps/meteor/app/importer/server/classes/converters/RoomConverter.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,10 @@ export class RoomConverter extends RecordConverter<IImportChannelRecord> {
9898

9999
if (roomData.t === 'd') {
100100
if (members.length < roomData.users.length) {
101-
this._logger.warn(`One or more imported users not found: ${roomData.users}`);
101+
this._logger.warn({
102+
msg: 'One or more imported users not found',
103+
users: roomData.users,
104+
});
102105
throw new Error('importer-channel-missing-users');
103106
}
104107
}
@@ -125,8 +128,7 @@ export class RoomConverter extends RecordConverter<IImportChannelRecord> {
125128

126129
roomData._id = roomInfo.rid;
127130
} catch (e) {
128-
this._logger.warn({ msg: 'Failed to create new room', name: roomData.name, members });
129-
this._logger.error(e);
131+
this._logger.warn({ msg: 'Failed to create new room', name: roomData.name, members, err: e });
130132
throw e;
131133
}
132134

0 commit comments

Comments
 (0)