Transform stream for Hapi Good process monitoring. Modify the incoming object stream with your own mapping functions.
Tested with
- Node 12/14/15, Hapi 19/20, Good 9
- Node 10, Hapi 18, Good 8
npm install good-map
Your Good logging configuration may look like this:
const Hapi = require('@hapi/hapi');
const Good = require('@hapi/good'),
const server = new Hapi.Server();
const options = {
reporters: {
myConsoleReporter: [{
module: '@hapi/good-squeeze',
name: 'Squeeze',
args: [{ log: '*', response: '*' }],
}, {
module: 'good-map',
args: [{
events: ['log'],
tags: ['error'],
map: {
timestamp: (ms) => moment(ms).utc().format(),
'database.password': () => '***',
'error.stack': (stack) => truncate(stack),
},
observe: (item) => {
item.service = 'foo';
},
}],
}, {
module: '@hapi/good-console',
}, 'stdout'],
},
};
await server.register({
plugin: Good,
options,
});
await server.start();
The good-map
transform stream can be placed anywhere in the pipeline where log values are still objects, e.g., after Squeeze
.
args
in the Good configuration for good-map
is an array with two arguments which are passed to GoodMap(rules, [options])
:
rules
: An object with the following parameters (all optional):events
: A list of Hapi server event types, e.g.,['request']
, for filtering purposes.tags
: A list of event tags, e.g.,['error']
, for filtering purposes.map
: An object that maps the log item's properties (including deep properties separated by dots), e.g.,timestamp
or'error.message'
to a mapping function (synchronous). It has the form(value) => 'newValue'
, e.g.,() => '***'
orstr => str.toUpperCase()
. If a property does not exist (before), it is not set. If the mapping function returnsundefined
, the property is deleted. If the mapping function throws an error, the error is ignored. For full flexibility, the second parameter provides access to the complete log item:(value, item) => ...
.observe
: Listen to the complete log item as it appears in the stream. The observer function (synchronous) has the form(item) => { ... }
. Use this hook to read and write to the log item. If the observer function throws an error, the error is ignored.
options
: An optional configuration object that gets passed to the Node Stream.Transform constructor.objectMode
is alwaystrue
.