node icon indicating copy to clipboard operation
node copied to clipboard

[WIP] lib: added logger api in node core

Open mertcanaltin opened this issue 1 month ago β€’ 12 comments

for: https://github.com/nodejs/node/issues/49296#issuecomment-3457576883

I try a draft development for new logger api, and i try create some benchmark for pino and node:logger package

mertcanaltin avatar Oct 28 '25 19:10 mertcanaltin

Review requested:

  • [ ] @nodejs/performance

nodejs-github-bot avatar Oct 28 '25 19:10 nodejs-github-bot

thats my first performance results:

I think need improvement for child logger area, but Δ±'m so happy because other results it looks nice. cc @mcollina @Qard @trentm @jsumners

node:logger vs pino

➜ node git:(mert/create-logger-api/node-core) βœ— ./node benchmark/logger/vs-pino.js n=100000
logger/vs-pino.js scenario="simple" logger="node-logger" n=100000: 5,240,540.823813018
logger/vs-pino.js scenario="child" logger="node-logger" n=100000: 2,635,847.7027229806
logger/vs-pino.js scenario="disabled" logger="node-logger" n=100000: 159,436,487.67795104
logger/vs-pino.js scenario="fields" logger="node-logger" n=100000: 3,619,336.304205216
logger/vs-pino.js scenario="simple" logger="pino" n=100000: 3,398,489.9761368227
logger/vs-pino.js scenario="child" logger="pino" n=100000: 4,489,799.803418606
logger/vs-pino.js scenario="disabled" logger="pino" n=100000: 119,772,384.56038144
logger/vs-pino.js scenario="fields" logger="pino" n=100000: 1,257,930.8609750536

mertcanaltin avatar Oct 29 '25 19:10 mertcanaltin

I now learn this feat in Pino

https://github.com/pinojs/pino/pull/2281

I will try add in node:logger

mertcanaltin avatar Oct 29 '25 22:10 mertcanaltin

This will require support for serializers

mcollina avatar Oct 30 '25 08:10 mcollina

This will require support for serializers

I wonder, should we name them like Pino does (built-in serializers), or go with something like standardSerializers ?

mertcanaltin avatar Oct 30 '25 10:10 mertcanaltin

This will require support for serializers

I wonder, should we name them like Pino does (built-in serializers), or go with something like standardSerializers ?

Follow pino and we’ll change it

mcollina avatar Nov 08 '25 10:11 mcollina

This will require support for serializers

I wonder, should we name them like Pino does (built-in serializers), or go with something like standardSerializers ?

Follow pino and we’ll change it

I tryed serializer implement for logger, and some bench result repaired

and fields and simple are experiencing a decline; I will try to resolve these

fields: 3.62M β†’ 2.16M (-40%) simple: 5.24M β†’ 4.87M (-7%)

previously, the results for the child logger were quite slow at around 70%, but the new results have dropped to 18% and have actually improved significantly.

I continue to try new methods.

➜  node git:(mert/create-logger-api/node-core) βœ— ./node benchmark/logger/vs-pino.js n=100000
logger/vs-pino.js scenario="simple" logger="node-logger" n=100000: 4,868,164.032787085
logger/vs-pino.js scenario="child" logger="node-logger" n=100000: 3,894,327.425314102
logger/vs-pino.js scenario="disabled" logger="node-logger" n=100000: 160,503,080.85663706
logger/vs-pino.js scenario="fields" logger="node-logger" n=100000: 2,157,462.3927336666
logger/vs-pino.js scenario="simple" logger="pino" n=100000: 3,424,706.4418693925
logger/vs-pino.js scenario="child" logger="pino" n=100000: 4,753,595.477010947
logger/vs-pino.js scenario="disabled" logger="pino" n=100000: 122,100,122.10012211
logger/vs-pino.js scenario="fields" logger="pino" n=100000: 1,411,215.99189962
➜  node git:(mert/create-logger-api/node-core) βœ— 

mertcanaltin avatar Nov 10 '25 13:11 mertcanaltin

This will require support for serializers

I wonder, should we name them like Pino does (built-in serializers), or go with something like standardSerializers ?

Follow pino and we’ll change it

I tryed serializer implement for logger, and some bench result repaired

and fields and simple are experiencing a decline; I will try to resolve these

fields: 3.62M β†’ 2.16M (-40%) simple: 5.24M β†’ 4.87M (-7%)

previously, the results for the child logger were quite slow at around 70%, but the new results have dropped to 18% and have actually improved significantly.

I continue to try new methods.

➜  node git:(mert/create-logger-api/node-core) βœ— ./node benchmark/logger/vs-pino.js n=100000
logger/vs-pino.js scenario="simple" logger="node-logger" n=100000: 4,868,164.032787085
logger/vs-pino.js scenario="child" logger="node-logger" n=100000: 3,894,327.425314102
logger/vs-pino.js scenario="disabled" logger="node-logger" n=100000: 160,503,080.85663706
logger/vs-pino.js scenario="fields" logger="node-logger" n=100000: 2,157,462.3927336666
logger/vs-pino.js scenario="simple" logger="pino" n=100000: 3,424,706.4418693925
logger/vs-pino.js scenario="child" logger="pino" n=100000: 4,753,595.477010947
logger/vs-pino.js scenario="disabled" logger="pino" n=100000: 122,100,122.10012211
logger/vs-pino.js scenario="fields" logger="pino" n=100000: 1,411,215.99189962
➜  node git:(mert/create-logger-api/node-core) βœ— 

I inspected pino and I learn some patterns, than I applied this commit and new results! https://github.com/nodejs/node/pull/60468/commits/1ededc779f061340ef07b2682c96e2e1c594436b

I used this patterns

removed the cost of serializing bindings in each log for the child logger, skipped unnecessary serializer checks, used direct string concatenation instead of object merging, sped up type checking

simple: 6.06M vs 3.48M ops/s (+74% faster) child: 5.76M vs 4.41M ops/s (+31% faster) disabled: 174M vs 146M ops/s (+19% faster) fields: 2.13M vs 1.36M ops/s (+56% faster)

➜  node git:(mert/create-logger-api/node-core) βœ— ./node benchmark/logger/vs-pino.js n=100000
logger/vs-pino.js scenario="simple" logger="node-logger" n=100000: 6,062,182.962986493
logger/vs-pino.js scenario="child" logger="node-logger" n=100000: 5,758,903.394222795
logger/vs-pino.js scenario="disabled" logger="node-logger" n=100000: 174,026,539.04720467
logger/vs-pino.js scenario="fields" logger="node-logger" n=100000: 2,126,059.37552321
logger/vs-pino.js scenario="simple" logger="pino" n=100000: 3,477,918.037575009
logger/vs-pino.js scenario="child" logger="pino" n=100000: 4,407,389.658686015
logger/vs-pino.js scenario="disabled" logger="pino" n=100000: 145,551,509.22359914
logger/vs-pino.js scenario="fields" logger="pino" n=100000: 1,363,125.197883181
➜  node git:(mert/create-logger-api/node-core) βœ— 

mertcanaltin avatar Nov 10 '25 14:11 mertcanaltin

hello @mcollina do you any comments or suggestions for this end commits, I'm curious πŸ™ .

mertcanaltin avatar Nov 20 '25 21:11 mertcanaltin

Codecov Report

:x: Patch coverage is 88.21752% with 78 lines in your changes missing coverage. Please review. :white_check_mark: Project coverage is 88.51%. Comparing base (6274eb7) to head (83a12b7). :warning: Report is 64 commits behind head on main.

Files with missing lines Patch % Lines
lib/logger.js 87.60% 73 Missing :warning:
lib/internal/logger/serializers.js 93.15% 5 Missing :warning:
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #60468      +/-   ##
==========================================
- Coverage   88.55%   88.51%   -0.04%     
==========================================
  Files         703      705       +2     
  Lines      208291   209158     +867     
  Branches    40170    40310     +140     
==========================================
+ Hits       184443   185135     +692     
- Misses      15874    16041     +167     
- Partials     7974     7982       +8     
Files with missing lines Coverage Ξ”
lib/internal/logger/serializers.js 93.15% <93.15%> (ΓΈ)
lib/logger.js 87.60% <87.60%> (ΓΈ)

... and 44 files with indirect coverage changes

:rocket: New features to boost your workflow:
  • :snowflake: Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • :package: JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

codecov[bot] avatar Nov 29 '25 16:11 codecov[bot]

I will today inspect this error

Error: --- stderr ---
node:internal/logger/serializers:12
  if (!ErrorIsError(error)) {
       ^

TypeError: ErrorIsError is not a function
    at Object.serializeErr [as err] (node:internal/logger/serializers:12:8)
    at #log (node:logger:481:29)
    at Logger.error (node:logger:558:14)
    at Object.<anonymous> (/home/runner/work/node/node/node/test/parallel/test-log-basic.js:288:10)
    at Module._compile (node:internal/modules/cjs/loader:1760:14)
    at Object..js (node:internal/modules/cjs/loader:1891:10)
    at Module.load (node:internal/modules/cjs/loader:1480:32)
    at Module._load (node:internal/modules/cjs/loader:1299:12)
    at TracingChannel.traceSync (node:diagnostics_channel:328:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:245:24)

Node.js v26.0.0-pre
Command: out/Release/node /home/runner/work/node/node/node/test/parallel/test-log-basic.js

Update: we solved this problem, used isNativeError

mertcanaltin avatar Dec 04 '25 10:12 mertcanaltin

I tried running parallel/test-debugger-backtrace test file locally and succes

mertcanaltin avatar Dec 07 '25 20:12 mertcanaltin