Skip to content

Commit 2dda26c

Browse files
authored
apply serializers to args once before asObject or transmit (#1971)
1 parent 8a20d79 commit 2dda26c

File tree

4 files changed

+52
-22
lines changed

4 files changed

+52
-22
lines changed

browser.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ function createWrap (self, opts, rootLogger, level) {
302302
const proto = (Object.getPrototypeOf && Object.getPrototypeOf(this) === _console) ? _console : this
303303
for (var i = 0; i < args.length; i++) args[i] = arguments[i]
304304

305-
if (opts.serialize && !opts.asObject) {
305+
if (opts.serialize && !opts.transmit) {
306306
applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize)
307307
}
308308
if (opts.asObject || opts.formatters) {
@@ -330,17 +330,22 @@ function createWrap (self, opts, rootLogger, level) {
330330

331331
function asObject (logger, level, args, ts, formatters = {}) {
332332
const {
333-
level: levelFormatter = () => logger.levels.values[level],
333+
level: levelFormatter,
334334
log: logObjectFormatter = (obj) => obj
335335
} = formatters
336-
if (logger._serialize) applySerializers(args, logger._serialize, logger.serializers, logger._stdErrSerialize)
337336
const argsCloned = args.slice()
338337
let msg = argsCloned[0]
339338
const logObject = {}
340339
if (ts) {
341340
logObject.time = ts
342341
}
343-
logObject.level = levelFormatter(level, logger.levels.values[level])
342+
343+
if (levelFormatter) {
344+
const formattedLevel = levelFormatter(level, logger.levels.values[level])
345+
Object.assign(logObject, formattedLevel)
346+
} else {
347+
logObject.level = logger.levels.values[level]
348+
}
344349

345350
let lvl = (logger._childLevel | 0) + 1
346351
if (lvl < 1) lvl = 1
@@ -361,9 +366,9 @@ function applySerializers (args, serialize, serializers, stdErrSerialize) {
361366
for (const i in args) {
362367
if (stdErrSerialize && args[i] instanceof Error) {
363368
args[i] = pino.stdSerializers.err(args[i])
364-
} else if (typeof args[i] === 'object' && !Array.isArray(args[i])) {
369+
} else if (typeof args[i] === 'object' && !Array.isArray(args[i]) && serialize) {
365370
for (const k in args[i]) {
366-
if (serialize && serialize.indexOf(k) > -1 && k in serializers) {
371+
if (serialize.indexOf(k) > -1 && k in serializers) {
367372
args[i][k] = serializers[k](args[i][k])
368373
}
369374
}
@@ -385,6 +390,7 @@ function transmit (logger, opts, args) {
385390
logger.serializers,
386391
logger._stdErrSerialize === undefined ? true : logger._stdErrSerialize
387392
)
393+
388394
logger._logEvent.ts = ts
389395
logger._logEvent.messages = args.filter(function (arg) {
390396
// bindings can only be objects, so reference equality check via indexOf is fine

docs/browser.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ Unlike server pino the serializers apply to every object passed to the logger me
144144
if the `asObject` option is `true`, this results in the serializers applying to the
145145
first object (as in server pino).
146146

147-
For more info on serializers see https://github.com/pinojs/pino/blob/master/docs/api.md#parameters.
147+
For more info on serializers see https://github.com/pinojs/pino/blob/master/docs/api.md#mergingobject.
148148

149149
### `transmit` (Object)
150150

test/browser-serializers.test.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,6 @@ test('children inherit parent serializers', ({ end, is }) => {
284284

285285
test('children serializers get called', ({ end, is }) => {
286286
const parent = pino({
287-
test: 'this',
288287
browser: {
289288
serialize: true,
290289
write (o) {
@@ -301,7 +300,6 @@ test('children serializers get called', ({ end, is }) => {
301300

302301
test('children serializers get called when inherited from parent', ({ end, is }) => {
303302
const parent = pino({
304-
test: 'this',
305303
serializers: parentSerializers,
306304
browser: {
307305
serialize: true,

test/browser.test.js

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ test('opts.browser.asObject logs pino-like object to console', ({ end, ok, is })
166166
end()
167167
})
168168

169-
test('opts.browser.formatters logs pino-like object to console', ({ end, ok, is }) => {
169+
test('opts.browser.formatters (level) logs pino-like object to console', ({ end, ok, is }) => {
170170
const info = console.info
171171
console.info = function (o) {
172172
is(o.level, 30)
@@ -189,7 +189,7 @@ test('opts.browser.formatters logs pino-like object to console', ({ end, ok, is
189189
end()
190190
})
191191

192-
test('opts.browser.formatters logs pino-like object to console', ({ end, ok, is }) => {
192+
test('opts.browser.formatters (log) logs pino-like object to console', ({ end, ok, is }) => {
193193
const info = console.info
194194
console.info = function (o) {
195195
is(o.level, 30)
@@ -213,40 +213,66 @@ test('opts.browser.formatters logs pino-like object to console', ({ end, ok, is
213213
end()
214214
})
215215

216-
test('opts.browser.write func log single string', ({ end, ok, is }) => {
217-
const instance = pino({
216+
test('opts.browser.serialize and opts.browser.transmit only serializes log data once', ({ end, ok, is }) => {
217+
const instance = require('../browser')({
218+
serializers: {
219+
extras (data) {
220+
return { serializedExtras: data }
221+
}
222+
},
218223
browser: {
224+
serialize: ['extras'],
225+
transmit: {
226+
level: 'info',
227+
send (level, o) {
228+
is(o.messages[0].extras.serializedExtras, 'world')
229+
}
230+
}
231+
}
232+
})
233+
234+
instance.info({ extras: 'world' }, 'test')
235+
end()
236+
})
237+
238+
test('opts.browser.serialize and opts.asObject only serializes log data once', ({ end, ok, is }) => {
239+
const instance = require('../browser')({
240+
serializers: {
241+
extras (data) {
242+
return { serializedExtras: data }
243+
}
244+
},
245+
browser: {
246+
serialize: ['extras'],
247+
asObject: true,
219248
write: function (o) {
220-
is(o.level, 30)
221-
is(o.msg, 'test')
222-
ok(o.time)
249+
is(o.extras.serializedExtras, 'world')
223250
}
224251
}
225252
})
226-
instance.info('test')
227253

254+
instance.info({ extras: 'world' }, 'test')
228255
end()
229256
})
230257

231-
test('opts.browser.write func string joining', ({ end, ok, is }) => {
258+
test('opts.browser.write func log single string', ({ end, ok, is }) => {
232259
const instance = pino({
233260
browser: {
234261
write: function (o) {
235262
is(o.level, 30)
236-
is(o.msg, 'test test2 test3')
263+
is(o.msg, 'test')
237264
ok(o.time)
238265
}
239266
}
240267
})
241-
instance.info('test %s %s', 'test2', 'test3')
268+
instance.info('test')
242269

243270
end()
244271
})
245272

246-
test('opts.browser.write func string joining when asObject is true', ({ end, ok, is }) => {
273+
test('opts.browser.write func string joining', ({ end, ok, is }) => {
247274
const instance = pino({
248275
browser: {
249-
asObject: true,
250276
write: function (o) {
251277
is(o.level, 30)
252278
is(o.msg, 'test test2 test3')

0 commit comments

Comments
 (0)