Skip to content

Commit

Permalink
feat: add level number to mixin callback (#1364)
Browse files Browse the repository at this point in the history
  • Loading branch information
techmunk authored Mar 13, 2022
1 parent 5cd49f1 commit 6fbd2fb
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 5 deletions.
22 changes: 19 additions & 3 deletions docs/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,8 @@ Option to limit stringification of properties/elements when logging a specific o
Default: `undefined`

If provided, the `mixin` function is called each time one of the active
logging methods is called. The first and only parameter is the value `mergeObject` or an empty object. The function must synchronously return an
object. The properties of the returned object will be added to the
logging methods is called. The first parameter is the value `mergeObject` or an empty object. The second parameter is the leg level number.
The function must synchronously return an object. The properties of the returned object will be added to the
logged JSON.

```js
Expand Down Expand Up @@ -153,12 +153,28 @@ const logger = pino({
logger.info({
description: 'Ok'
}, 'Message 1')
// {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","appName":"My app","description":"Ok" "msg":"Message 1"}
// {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","appName":"My app","description":"Ok","msg":"Message 1"}
logger.info('Message 2')
// {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","appName":"My app","description":"Ok","msg":"Message 2"}
// Note: the second log contains "description":"Ok" text, even if it was not provided.
```

The `mixin` method can be used to add the level label to each log message such as in the following example:
```js
const logger = pino({
mixin(_context, level) {
return { 'level-label': logger.levels.labels[level] }
}
})

logger.info({
description: 'Ok'
}, 'Message 1')
// {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","appName":"My app","description":"Ok","level-label":"info","msg":"Message 1"}
logger.error('Message 2')
// {"level":30,"time":1591195061437,"pid":16012,"hostname":"x","appName":"My app","description":"Ok","level-label":"error","msg":"Message 2"}
```

If the `mixin` feature is being used merely to add static metadata to each log message,
then a [child logger ⇗](/docs/child-loggers.md) should be used instead.

Expand Down
2 changes: 1 addition & 1 deletion lib/proto.js
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ function write (_obj, msg, num) {
}

if (mixin) {
obj = mixinMergeStrategy(obj, mixin(obj))
obj = mixinMergeStrategy(obj, mixin(obj, num))
}

const s = this[asJsonSym](obj, msg, num, t)
Expand Down
2 changes: 1 addition & 1 deletion pino.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import type { WorkerOptions } from "worker_threads";
type ThreadStream = any

type TimeFn = () => string;
type MixinFn = (mergeObject: object) => object;
type MixinFn = (mergeObject: object, level: number) => object;
type MixinMergeStrategyFn = (mergeObject: object, mixinObject: object) => object;

type CustomLevelLogger<Options> = Options extends { customLevels: Record<string, number> } ? Record<keyof Options["customLevels"], LogFn> : Record<never, LogFn>
Expand Down
20 changes: 20 additions & 0 deletions test/mixin.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,23 @@ test('mixin works without context', async ({ ok, same }) => {
instance.level = name
instance[name]('test')
})

test('mixin can use level number', async ({ ok, same }) => {
const stream = sink()
const instance = pino({
mixin (context, num) {
ok(num !== null, 'level should be defined')
ok(num !== undefined, 'level should be defined')
same(num, level)
return Object.assign({
error: context.message,
stack: context.stack
})
}
}, stream)
instance.level = name
instance[name]({
message: '123',
stack: 'stack'
}, 'test')
})
8 changes: 8 additions & 0 deletions test/types/pino.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,14 @@ pino({
mixin: () => ({ customName: "unknown", customId: 111 }),
});

pino({
mixin: (context: object) => ({ customName: "unknown", customId: 111 }),
});

pino({
mixin: (context: object, level: number) => ({ customName: "unknown", customId: 111 }),
});

pino({
redact: { paths: [], censor: "SECRET" },
});
Expand Down

0 comments on commit 6fbd2fb

Please sign in to comment.