feat: add level number to mixin callback (#1364)

This commit is contained in:
techmunk 2022-03-14 04:12:14 +10:00 committed by GitHub
parent 5cd49f1412
commit 6fbd2fb25f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 49 additions and 5 deletions

View File

@ -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
@ -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.

View File

@ -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)

2
pino.d.ts vendored
View File

@ -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>

View File

@ -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')
})

View File

@ -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" },
});