Skip to content

Commit 7df8840

Browse files
authored
feat: add a formatters option to browser pino (#1898)
1 parent d7afda4 commit 7df8840

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

browser.js

+14-4
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ function pino (opts) {
109109
transmit,
110110
serialize,
111111
asObject: opts.browser.asObject,
112+
formatters: opts.browser.formatters,
112113
levels,
113114
timestamp: getTimeFunction(opts)
114115
}
@@ -299,8 +300,9 @@ function createWrap (self, opts, rootLogger, level) {
299300
if (opts.serialize && !opts.asObject) {
300301
applySerializers(args, this._serialize, this.serializers, this._stdErrSerialize)
301302
}
302-
if (opts.asObject) write.call(proto, asObject(this, level, args, ts))
303-
else write.apply(proto, args)
303+
if (opts.asObject || opts.formatters) {
304+
write.call(proto, asObject(this, level, args, ts, opts.formatters))
305+
} else write.apply(proto, args)
304306

305307
if (opts.transmit) {
306308
const transmitLevel = opts.transmit.level || self._level
@@ -321,15 +323,23 @@ function createWrap (self, opts, rootLogger, level) {
321323
})(self[baseLogFunctionSymbol][level])
322324
}
323325

324-
function asObject (logger, level, args, ts) {
326+
function asObject (logger, level, args, ts, formatters = {}) {
327+
const {
328+
level: levelFormatter
329+
} = formatters
325330
if (logger._serialize) applySerializers(args, logger._serialize, logger.serializers, logger._stdErrSerialize)
326331
const argsCloned = args.slice()
327332
let msg = argsCloned[0]
328333
const o = {}
329334
if (ts) {
330335
o.time = ts
331336
}
332-
o.level = logger.levels.values[level]
337+
if (levelFormatter) {
338+
const formattedLevel = levelFormatter(level, logger.levels.values[level])
339+
Object.assign(o, formattedLevel)
340+
} else {
341+
o.level = logger.levels.values[level]
342+
}
333343
let lvl = (logger._childLevel | 0) + 1
334344
if (lvl < 1) lvl = 1
335345
// deliberate, catching objects, arrays

docs/browser.md

+19
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,25 @@ pino.info('hi') // creates and logs {msg: 'hi', level: 30, time: <ts>}
2727

2828
When `write` is set, `asObject` will always be `true`.
2929

30+
### `formatters` (Object)
31+
32+
An object containing functions for formatting the shape of the log lines. When provided, it enables the logger to produce a pino-like log object with customized formatting. Currently, it supports formatting for the `level` object only.
33+
34+
##### `level`
35+
36+
Changes the shape of the log level. The default shape is `{ level: number }`.
37+
The function takes two arguments, the label of the level (e.g. `'info'`)
38+
and the numeric value (e.g. `30`).
39+
40+
```js
41+
const formatters = {
42+
level (label, number) {
43+
return { level: number }
44+
}
45+
}
46+
```
47+
48+
3049
### `write` (Function | Object)
3150

3251
Instead of passing log messages to `console.log` they can be passed to

test/browser.test.js

+23
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,29 @@ 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 }) => {
170+
const info = console.info
171+
console.info = function (o) {
172+
is(o.level, 30)
173+
is(o.label, 'info')
174+
is(o.msg, 'test')
175+
ok(o.time)
176+
console.info = info
177+
}
178+
const instance = require('../browser')({
179+
browser: {
180+
formatters: {
181+
level (label, number) {
182+
return { label, level: number }
183+
}
184+
}
185+
}
186+
})
187+
188+
instance.info('test')
189+
end()
190+
})
191+
169192
test('opts.browser.write func log single string', ({ end, ok, is }) => {
170193
const instance = pino({
171194
browser: {

0 commit comments

Comments
 (0)