Skip to content

Commit 566dd00

Browse files
PR requested changes 3
1 parent 8a0b25d commit 566dd00

File tree

2 files changed

+55
-44
lines changed

2 files changed

+55
-44
lines changed

src/mongo_logger.ts

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { inspect } from 'util';
1+
import { inspect, promisify } from 'util';
22

33
import { type Document, EJSON, type EJSONOptions, type ObjectId } from './bson';
44
import type { CommandStartedEvent } from './cmap/command_monitoring_events';
@@ -219,10 +219,10 @@ export function createStdioLogger(stream: {
219219
write: NodeJS.WriteStream['write'];
220220
}): MongoDBLogWritable {
221221
return {
222-
write: (log: Log): unknown => {
223-
stream.write(inspect(log, { compact: true, breakLength: Infinity }), 'utf-8');
222+
write: promisify((log: Log, cb: () => void): unknown => {
223+
stream.write(inspect(log, { compact: true, breakLength: Infinity }), 'utf-8', cb);
224224
return;
225-
}
225+
})
226226
};
227227
}
228228

@@ -283,7 +283,7 @@ export interface Log extends Record<string, any> {
283283

284284
/** @internal */
285285
export interface MongoDBLogWritable {
286-
write(log: Log): PromiseLike<unknown> | any;
286+
write(log: Log): PromiseLike<unknown> | unknown;
287287
}
288288

289289
function compareSeverity(s0: SeverityLevel, s1: SeverityLevel): 1 | 0 | -1 {
@@ -750,32 +750,29 @@ export class MongoLogger {
750750
}
751751

752752
turnOffSeverities() {
753-
for (const key of Object.keys(MongoLoggableComponent)) {
753+
for (const key of Object.values(MongoLoggableComponent)) {
754754
this.componentSeverities[key as MongoLoggableComponent] = SeverityLevel.OFF;
755755
}
756756
}
757757

758758
private logWriteFailureHandler(error: Error) {
759-
try {
760-
if (this.logDestinationIsStdErr) {
761-
this.turnOffSeverities();
762-
this.clearPendingLog();
763-
return;
764-
}
765-
this.logDestination = createStdioLogger(process.stderr);
766-
this.logDestinationIsStdErr = true;
767-
this.clearPendingLog();
768-
this.error(MongoLoggableComponent.CLIENT, {
769-
toLog: function () {
770-
return {
771-
message: 'User input for mongodbLogPath is now invalid. Now logging to stderr.',
772-
error: error.message
773-
};
774-
}
775-
});
776-
} catch (e) {
759+
if (this.logDestinationIsStdErr) {
777760
this.turnOffSeverities();
761+
this.clearPendingLog();
762+
return;
778763
}
764+
this.logDestination = createStdioLogger(process.stderr);
765+
this.logDestinationIsStdErr = true;
766+
this.clearPendingLog();
767+
this.error(MongoLoggableComponent.CLIENT, {
768+
toLog: function () {
769+
return {
770+
message: 'User input for mongodbLogPath is now invalid. Logging is halted.',
771+
error: error.message
772+
};
773+
}
774+
});
775+
this.turnOffSeverities();
779776
this.clearPendingLog();
780777
}
781778

test/unit/mongo_logger.test.ts

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,7 +1345,11 @@ describe('class MongoLogger', async function () {
13451345

13461346
describe('log', async function () {
13471347
const componentSeverities: MongoLoggerOptions['componentSeverities'] = {
1348-
default: 'error'
1348+
command: 'trace',
1349+
topology: 'trace',
1350+
serverSelection: 'trace',
1351+
connection: 'trace',
1352+
client: 'trace'
13491353
} as any;
13501354
describe('sync stream failure handling', function () {
13511355
context('when stream is not stderr', function () {
@@ -1373,15 +1377,18 @@ describe('class MongoLogger', async function () {
13731377
logDestinationIsStdErr: false
13741378
});
13751379
// print random message at the debug level
1376-
logger.debug('random message');
1380+
logger.debug('client', 'random message');
13771381
let stderrStubCall = stderrStub.write.getCall(0).args[0];
13781382
stderrStubCall = stderrStubCall.slice(stderrStubCall.search('c:'));
13791383
expect(stderrStubCall).to.equal(
1380-
`c: 'client', s: 'error', message: 'User input for mongodbLogPath is now invalid. Now logging to stderr.', error: 'This writable always throws' }`
1384+
`c: 'client', s: 'error', message: 'User input for mongodbLogPath is now invalid. Logging is halted.', error: 'This writable always throws' }`
13811385
);
1382-
logger.debug('random message 2');
1386+
1387+
// logging is halted
1388+
logger.debug('client', 'random message 2');
13831389
const stderrStubCall2 = stderrStub.write.getCall(1);
1384-
expect(stderrStubCall2).to.not.be.null;
1390+
expect(stderrStubCall2).to.be.null;
1391+
expect(Object.keys(logger.componentSeverities).every(key => key === SeverityLevel.OFF));
13851392
});
13861393
});
13871394
});
@@ -1413,7 +1420,7 @@ describe('class MongoLogger', async function () {
14131420
logDestinationIsStdErr: false
14141421
});
14151422
// print random message at the debug level
1416-
logger.debug('random message');
1423+
logger.debug('client', 'random message');
14171424

14181425
// before timeout resolves, no error
14191426
expect(stderrStub.write.getCall(0)).to.be.null;
@@ -1425,12 +1432,14 @@ describe('class MongoLogger', async function () {
14251432
let stderrStubCall = stderrStub.write.getCall(0).args[0];
14261433
stderrStubCall = stderrStubCall.slice(stderrStubCall.search('c:'));
14271434
expect(stderrStubCall).to.equal(
1428-
`c: 'client', s: 'error', message: 'User input for mongodbLogPath is now invalid. Now logging to stderr.', error: 'This writable always throws, but only after at least 500ms' }`
1435+
`c: 'client', s: 'error', message: 'User input for mongodbLogPath is now invalid. Logging is halted.', error: 'This writable always throws, but only after at least 500ms' }`
14291436
);
14301437

1431-
logger.debug('random message 2');
1438+
// no more logging in the future
1439+
logger.debug('client', 'random message 2');
14321440
const stderrStubCall2 = stderrStub.write.getCall(1);
1433-
expect(stderrStubCall2).to.not.be.null;
1441+
expect(stderrStubCall2).to.be.null;
1442+
expect(Object.keys(logger.componentSeverities).every(key => key === SeverityLevel.OFF));
14341443
});
14351444
});
14361445

@@ -1444,17 +1453,22 @@ describe('class MongoLogger', async function () {
14441453
logDestination: createStdioLogger(process.stdout),
14451454
logDestinationIsStdErr: false
14461455
});
1447-
logger.debug('random message');
1456+
logger.debug('client', 'random message');
1457+
14481458
// manually wait for promise to resolve (takes extra time with promisify)
14491459
await sleep(600);
1460+
14501461
let stderrStubCall = stderrStub.write.getCall(0).args[0];
14511462
stderrStubCall = stderrStubCall.slice(stderrStubCall.search('c:'));
14521463
expect(stderrStubCall).to.equal(
1453-
`c: 'client', s: 'error', message: 'User input for mongodbLogPath is now invalid. Now logging to stderr.', error: 'I am stdout and do not work' }`
1464+
`c: 'client', s: 'error', message: 'User input for mongodbLogPath is now invalid. Logging is halted.', error: 'I am stdout and do not work' }`
14541465
);
1455-
logger.debug('random message 2');
1466+
1467+
// logging is halted
1468+
logger.debug('client', 'random message 2');
14561469
const stderrStubCall2 = stderrStub.write.getCall(1);
1457-
expect(stderrStubCall2).to.not.be.null;
1470+
expect(stderrStubCall2).to.be.null;
1471+
expect(Object.keys(logger.componentSeverities).every(key => key === SeverityLevel.OFF));
14581472
});
14591473
});
14601474
});
@@ -1476,7 +1490,7 @@ describe('class MongoLogger', async function () {
14761490
logDestination: createStdioLogger(process.stderr),
14771491
logDestinationIsStdErr: true
14781492
});
1479-
expect(() => logger.debug('random message')).to.not.throw(Error);
1493+
expect(() => logger.debug('client', 'random message')).to.not.throw(Error);
14801494
expect(Object.keys(logger.componentSeverities).every(key => key === SeverityLevel.OFF));
14811495
});
14821496
});
@@ -1487,12 +1501,12 @@ describe('class MongoLogger', async function () {
14871501
const stream = {
14881502
buffer: [],
14891503
async write(log) {
1490-
if (log.c === 'longer timeout') {
1504+
if (log.message === 'longer timeout') {
14911505
await sleep(2000);
1492-
} else if (log.c === 'shorter timeout') {
1506+
} else if (log.message === 'shorter timeout') {
14931507
await sleep(500);
14941508
}
1495-
this.buffer.push(log.c);
1509+
this.buffer.push(log.message);
14961510
}
14971511
};
14981512
const logger = new MongoLogger({
@@ -1502,9 +1516,9 @@ describe('class MongoLogger', async function () {
15021516
logDestinationIsStdErr: false
15031517
});
15041518

1505-
logger.debug('longer timeout');
1506-
logger.debug('shorter timeout');
1507-
logger.debug('no timeout');
1519+
logger.debug('client', 'longer timeout');
1520+
logger.debug('client', 'shorter timeout');
1521+
logger.debug('client', 'no timeout');
15081522

15091523
expect(stream.buffer.length).to.equal(0);
15101524

0 commit comments

Comments
 (0)