Skip to content

Commit 7f5db55

Browse files
committed
lib: added logger package in node core
1 parent fb34515 commit 7f5db55

File tree

4 files changed

+727
-0
lines changed

4 files changed

+727
-0
lines changed

benchmark/log/basic-json.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const { createLogger, JSONHandler } = require('node:logger');
5+
const fs = require('fs');
6+
7+
const bench = common.createBenchmark(main, {
8+
n: [1e5],
9+
level: ['info', 'debug'],
10+
fields: [0, 5],
11+
type: ['simple', 'child', 'disabled'],
12+
});
13+
14+
function main({ n, level, fields, type }) {
15+
// Use /dev/null to avoid I/O overhead in benchmarks
16+
const nullFd = fs.openSync('/dev/null', 'w');
17+
const handler = new JSONHandler({ stream: nullFd, level: 'info' });
18+
const logger = createLogger({ handler, level });
19+
20+
// Create test data based on fields count
21+
const logData = { msg: 'benchmark test message' };
22+
for (let i = 0; i < fields; i++) {
23+
logData[`field${i}`] = `value${i}`;
24+
}
25+
26+
let testLogger;
27+
switch (type) {
28+
case 'simple':
29+
testLogger = logger;
30+
break;
31+
case 'child':
32+
testLogger = logger.child({ requestId: 'bench-123', userId: 456 });
33+
break;
34+
case 'disabled': {
35+
// When level is debug and handler is info, logs will be disabled
36+
const nullFd2 = fs.openSync('/dev/null', 'w');
37+
38+
testLogger = createLogger({
39+
handler: new JSONHandler({ stream: nullFd2, level: 'warn' }),
40+
level: 'debug',
41+
});
42+
break;
43+
}
44+
}
45+
46+
bench.start();
47+
for (let i = 0; i < n; i++) {
48+
testLogger.info(logData);
49+
}
50+
bench.end(n);
51+
52+
handler.end();
53+
}

benchmark/log/vs-pino.js

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
'use strict';
2+
3+
// Benchmark: Compare node:log vs Pino
4+
// This benchmark compares the performance of the new node:log module
5+
// against Pino, which is the performance target
6+
7+
const common = require('../common');
8+
const fs = require('fs');
9+
10+
const bench = common.createBenchmark(main, {
11+
n: [1e5],
12+
logger: ['node-log', 'pino'],
13+
scenario: ['simple', 'child', 'disabled', 'fields'],
14+
});
15+
16+
function main({ n, logger, scenario }) {
17+
const nullFd = fs.openSync('/dev/null', 'w');
18+
let testLogger;
19+
let logData;
20+
21+
if (logger === 'node-log') {
22+
const { createLogger, JSONHandler } = require('node:logger');
23+
const handler = new JSONHandler({ stream: nullFd, level: 'info' });
24+
const baseLogger = createLogger({ handler });
25+
26+
switch (scenario) {
27+
case 'simple':
28+
testLogger = baseLogger;
29+
logData = { msg: 'benchmark test message' };
30+
break;
31+
32+
case 'child':
33+
testLogger = baseLogger.child({ requestId: 'req-123', userId: 456 });
34+
logData = { msg: 'benchmark test message' };
35+
break;
36+
37+
case 'disabled': {
38+
// Debug logs when handler level is 'warn' (disabled)
39+
const warnHandler = new JSONHandler({ stream: nullFd, level: 'warn' });
40+
testLogger = createLogger({ handler: warnHandler, level: 'debug' });
41+
logData = { msg: 'benchmark test message' };
42+
break;
43+
}
44+
45+
case 'fields':
46+
testLogger = baseLogger;
47+
logData = {
48+
msg: 'benchmark test message',
49+
field1: 'value1',
50+
field2: 'value2',
51+
field3: 'value3',
52+
field4: 'value4',
53+
field5: 'value5',
54+
};
55+
break;
56+
}
57+
58+
bench.start();
59+
for (let i = 0; i < n; i++) {
60+
testLogger.info(logData);
61+
}
62+
bench.end(n);
63+
64+
// Don't close FD immediately, let async writes complete
65+
66+
} else if (logger === 'pino') {
67+
const pino = require('pino');
68+
const destination = pino.destination({ dest: nullFd, sync: false });
69+
70+
switch (scenario) {
71+
case 'simple':
72+
testLogger = pino({ level: 'info' }, destination);
73+
logData = { msg: 'benchmark test message' };
74+
break;
75+
76+
case 'child': {
77+
const baseLogger = pino({ level: 'info' }, destination);
78+
testLogger = baseLogger.child({ requestId: 'req-123', userId: 456 });
79+
logData = { msg: 'benchmark test message' };
80+
break;
81+
}
82+
83+
case 'disabled':
84+
testLogger = pino({ level: 'warn' }, destination);
85+
logData = { msg: 'benchmark test message' };
86+
break;
87+
88+
case 'fields':
89+
testLogger = pino({ level: 'info' }, destination);
90+
logData = {
91+
msg: 'benchmark test message',
92+
field1: 'value1',
93+
field2: 'value2',
94+
field3: 'value3',
95+
field4: 'value4',
96+
field5: 'value5',
97+
};
98+
break;
99+
}
100+
101+
bench.start();
102+
for (let i = 0; i < n; i++) {
103+
if (scenario === 'disabled') {
104+
// Use debug level to test disabled logging
105+
testLogger.debug(logData);
106+
} else {
107+
testLogger.info(logData);
108+
}
109+
}
110+
bench.end(n);
111+
112+
// Don't close FD immediately for Pino either
113+
114+
}
115+
}

0 commit comments

Comments
 (0)