add new streamWrite hook (#2105)

This commit is contained in:
Theo Ephraim 2024-12-14 08:17:17 -08:00 committed by GitHub
parent 1bff08ae86
commit bb1f89dbd9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 54 additions and 3 deletions

View File

@ -375,6 +375,23 @@ const hooks = {
}
```
<a id="streamWrite"></a>
##### `streamWrite`
Allows for manipulating the _stringified_ JSON log data just before writing to various transports.
The method receives the stringified JSON and must return valid stringified JSON.
For example:
```js
const hooks = {
streamWrite (s) {
return s.replaceAll('sensitive-api-key', 'XXX')
}
}
```
<a id=opt-formatters></a>
#### `formatters` (Object)

View File

@ -27,7 +27,8 @@ const {
stringifySym,
formatOptsSym,
stringifiersSym,
msgPrefixSym
msgPrefixSym,
hooksSym
} = require('./symbols')
const {
getLevel,
@ -185,6 +186,7 @@ function write (_obj, msg, num) {
const messageKey = this[messageKeySym]
const mixinMergeStrategy = this[mixinMergeStrategySym] || defaultMixinMergeStrategy
let obj
const streamWriteHook = this[hooksSym].streamWrite
if (_obj === undefined || _obj === null) {
obj = {}
@ -214,7 +216,7 @@ function write (_obj, msg, num) {
stream.lastTime = t.slice(this[timeSliceIndexSym])
stream.lastLogger = this // for child loggers
}
stream.write(s)
stream.write(streamWriteHook ? streamWriteHook(s) : s)
}
function noop () {}

6
pino.d.ts vendored
View File

@ -641,6 +641,12 @@ declare namespace pino {
* using apply, like so: method.apply(this, newArgumentsArray).
*/
logMethod?: (this: Logger, args: Parameters<LogFn>, method: LogFn, level: number) => void;
/**
* Allows for manipulating the stringified JSON log output just before writing to various transports.
* This function must return a string and must be valid JSON.
*/
streamWrite?: (s: string) => string;
};
/**

View File

@ -70,7 +70,8 @@ const defaultOptions = {
}
}),
hooks: {
logMethod: undefined
logMethod: undefined,
streamWrite: undefined
},
timestamp: epochTime,
name: undefined,

View File

@ -95,3 +95,24 @@ tap.test('log method hook', t => {
t.end()
})
tap.test('streamWrite hook', t => {
t.test('gets invoked', async t => {
t.plan(1)
const stream = sink()
const logger = pino({
hooks: {
streamWrite (s) {
return s.replaceAll('redact-me', 'XXX')
}
}
}, stream)
const o = once(stream, 'data')
logger.info('hide redact-me in this string')
t.match(await o, { msg: 'hide XXX in this string' })
})
t.end()
})

View File

@ -209,6 +209,10 @@ const withHooks = pino({
expectType<pino.Logger>(this);
return method.apply(this, args);
},
streamWrite(s) {
expectType<string>(s);
return s.replaceAll('secret-key', 'xxx');
},
},
});