Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7f5db55
lib: added logger package in node core
mertcanaltin Oct 28, 2025
e149af2
lib: implement flexible API and error serialization for logger
mertcanaltin Oct 29, 2025
92f681b
lib: refactor logger to use diagnostics_channel
mertcanaltin Oct 29, 2025
2af2358
doc: create md file for logger api
mertcanaltin Oct 29, 2025
630e66c
update benchmark
mertcanaltin Oct 29, 2025
6b7756b
revert comments
mertcanaltin Oct 29, 2025
0451872
Update logger.js
mertcanaltin Oct 29, 2025
4c781ec
Update basic-json.js
mertcanaltin Oct 29, 2025
091f13c
Update vs-pino.js
mertcanaltin Oct 29, 2025
9a47a53
lib: reorder logger exports to follow Node.js conventions
mertcanaltin Oct 29, 2025
40f4f1d
Update lib/logger.js
mertcanaltin Oct 30, 2025
df2b7fe
Update lib/logger.js
mertcanaltin Oct 30, 2025
91ae0f6
Update lib/logger.js
mertcanaltin Oct 30, 2025
41e337e
Update lib/logger.js
mertcanaltin Oct 30, 2025
9916336
Update lib/logger.js
mertcanaltin Oct 30, 2025
f4e10c9
Update lib/logger.js
mertcanaltin Oct 30, 2025
7b4e917
Update lib/logger.js
mertcanaltin Oct 30, 2025
d9c5155
Update lib/logger.js
mertcanaltin Oct 30, 2025
40d8b40
Update lib/logger.js
mertcanaltin Oct 30, 2025
239dc56
Update lib/logger.js
mertcanaltin Oct 30, 2025
ad2a56a
Update lib/logger.js
mertcanaltin Oct 30, 2025
9c2e2a9
lib: optimize logger by checking hasSubscribers early
mertcanaltin Oct 30, 2025
11a9b97
lib: handle cause case
mertcanaltin Oct 30, 2025
b216a27
lib: use validateOneOf
mertcanaltin Oct 30, 2025
7f45ee4
lib: use ErrorIsError
mertcanaltin Oct 30, 2025
f2aa86d
lib: add logger module with diagnostics_channel
mertcanaltin Oct 30, 2025
f1abaad
git commit -m "make internal properties and methods truly private
mertcanaltin Oct 31, 2025
5815b29
make internal properties and methods truly private
mertcanaltin Oct 31, 2025
f337c39
make internal properties and methods truly private
mertcanaltin Oct 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions benchmark/logger/basic-json.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
'use strict';

const common = require('../common');
const { createLogger, JSONHandler } = require('node:logger');
const fs = require('node:fs');

const bench = common.createBenchmark(main, {
n: [1e5],
level: ['info', 'debug'],
fields: [0, 5],
type: ['simple', 'child', 'disabled'],
});

function main({ n, level, fields, type }) {
// Use /dev/null to avoid I/O overhead in benchmarks
const nullFd = fs.openSync('/dev/null', 'w');
const handler = new JSONHandler({ stream: nullFd, level: 'info' });
const logger = createLogger({ handler, level });

// Create test data based on fields count
const logData = { msg: 'benchmark test message' };
for (let i = 0; i < fields; i++) {
logData[`field${i}`] = `value${i}`;
}

let testLogger;
switch (type) {
case 'simple':
testLogger = logger;
break;
case 'child':
testLogger = logger.child({ requestId: 'bench-123', userId: 456 });
break;
case 'disabled': {
// When level is debug and handler is info, logs will be disabled
const nullFd2 = fs.openSync('/dev/null', 'w');

testLogger = createLogger({
handler: new JSONHandler({ stream: nullFd2, level: 'warn' }),
level: 'debug',
});
break;
}
}

bench.start();
for (let i = 0; i < n; i++) {
testLogger.info(logData);
}
bench.end(n);

handler.end();
}
146 changes: 146 additions & 0 deletions benchmark/logger/vs-pino.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
'use strict';

const common = require('../common');
const fs = require('node:fs');

const bench = common.createBenchmark(main, {
n: [1e5],
logger: ['node-logger', 'pino'],
scenario: ['simple', 'child', 'disabled', 'fields'],
});

function main({ n, logger, scenario }) {
const nullFd = fs.openSync('/dev/null', 'w');
let testLogger;
let consumer;

if (logger === 'node-logger') {
const { createLogger, JSONConsumer } = require('logger');

switch (scenario) {
case 'simple': {
consumer = new JSONConsumer({ stream: nullFd, level: 'info' });
consumer.attach();
testLogger = createLogger({ level: 'info' });

bench.start();
for (let i = 0; i < n; i++) {
testLogger.info('benchmark test message');
}
bench.end(n);
break;
}

case 'child': {
consumer = new JSONConsumer({ stream: nullFd, level: 'info' });
consumer.attach();
const baseLogger = createLogger({ level: 'info' });
testLogger = baseLogger.child({ requestId: 'req-123', userId: 456 });

bench.start();
for (let i = 0; i < n; i++) {
testLogger.info('benchmark test message');
}
bench.end(n);
break;
}

case 'disabled': {
consumer = new JSONConsumer({ stream: nullFd, level: 'warn' });
consumer.attach();
testLogger = createLogger({ level: 'warn' });

bench.start();
for (let i = 0; i < n; i++) {
testLogger.debug('benchmark test message');
}
bench.end(n);
break;
}

case 'fields': {
consumer = new JSONConsumer({ stream: nullFd, level: 'info' });
consumer.attach();
testLogger = createLogger({ level: 'info' });

bench.start();
for (let i = 0; i < n; i++) {
testLogger.info('benchmark test message', {
field1: 'value1',
field2: 'value2',
field3: 'value3',
field4: 'value4',
field5: 'value5',
});
}
bench.end(n);
break;
}
}

if (consumer) {
consumer.flushSync();
}
fs.closeSync(nullFd);

} else if (logger === 'pino') {
const pino = require('pino');
const destination = pino.destination({ dest: nullFd, sync: false });

switch (scenario) {
case 'simple': {
testLogger = pino({ level: 'info' }, destination);

bench.start();
for (let i = 0; i < n; i++) {
testLogger.info('benchmark test message');
}
bench.end(n);
break;
}

case 'child': {
const baseLogger = pino({ level: 'info' }, destination);
testLogger = baseLogger.child({ requestId: 'req-123', userId: 456 });

bench.start();
for (let i = 0; i < n; i++) {
testLogger.info('benchmark test message');
}
bench.end(n);
break;
}

case 'disabled': {
testLogger = pino({ level: 'warn' }, destination);

bench.start();
for (let i = 0; i < n; i++) {
testLogger.debug('benchmark test message');
}
bench.end(n);
break;
}

case 'fields': {
testLogger = pino({ level: 'info' }, destination);

bench.start();
for (let i = 0; i < n; i++) {
testLogger.info({
msg: 'benchmark test message',
field1: 'value1',
field2: 'value2',
field3: 'value3',
field4: 'value4',
field5: 'value5',
});
}
bench.end(n);
break;
}
}

destination.flushSync();
}
}
10 changes: 10 additions & 0 deletions doc/api/logger.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Logger

<!--introduced_in=v26.0.0-->

> Stability: 1 - Experimental
<!-- source_link=lib/logger.js -->

The `node:logger` module provides structured logging capabilities for Node.js
applications.
Loading