Hapi plugin for the Pino logger. It logs in JSON for easy post-processing.
- hapi-pino v2.0.0 is the LTS line for Hapi v16.
- hapi-pino v3+ supports Hapi v17 only. The maximum version that can be used with Hapi v16 is Pino v4.
- hapi-pino v5.3+ supports Hapi v17 and v18
For Pino v5+
npm install hapi-pino
For Pino v4 and below:
npm install hapi-pino@legacy #install hapi-pino v4.x.x
'use strict'
require('make-promises-safe')
const Hapi = require('hapi')
async function start () {
// Create a server with a host and port
const server = Hapi.server({
host: 'localhost',
port: 3000
})
// Add the route
server.route({
method: 'GET',
path: '/',
handler: async function (request, h) {
// request.log is HAPI standard way of logging
request.log(['a', 'b'], 'Request into hello world')
// you can also use a pino instance, which will be faster
request.logger.info('In handler %s', request.path)
return 'hello world'
}
})
await server.register({
plugin: require('.'),
options: {
prettyPrint: process.env.NODE_ENV !== 'production',
// Redact Authorization headers, see https://getpino.io/#/docs/redaction
redact: ['req.headers.authorization']
}
})
// also as a decorated API
server.logger().info('another way for accessing it')
// and through Hapi standard logging system
server.log(['subsystem'], 'third way for accessing it')
await server.start()
return server
}
start().catch((err) => {
console.log(err)
process.exit(1)
})
hapi-pino goal is to enable Hapi applications to log via pino. To enable this, it decorates both the server and the request. Moreover, hapi-pino binds to the Hapi events system as described in the "Hapi events" section.
[logPayload]
– when enabled, add the request payload aspayload
to theresponse
event log. Defaults tofalse
.[logRouteTags]
– when enabled, add the request route tags (as configured in hapiroute.options.tags
)tags
to theresponse
event log. Defaults tofalse
.[stream]
- the binary stream to write stuff to, defaults toprocess.stdout
.[prettyPrint]
- pretty print the logs (same asnode server | pino
), disable in production. Default isfalse
, enable in development by passingtrue
.[tags]
- a map to specify pairs of Hapi log tags and levels. By default, the tags trace, debug, info, warn, and error map to their corresponding level. Any mappings you supply take precedence over the default mappings. The default level tags are exposed viahapi-pino.levelTags
.[allTags]
- the logging level to apply to all tags not matched bytags
, defaults to'info'
.[serializers]
- an object to overwrite the default serializers. You can but don't have to overwrite all of them. E.g. to redact the authorization header in the logs:{ req: require('pino-noir')(['req.headers.authorization']).req res: ... err: ... }
[instance]
- uses a previously created Pino instance as the logger. The instance'sstream
andserializers
take precedence.[logEvents]
- Takes an array of strings with the events to log. Default is to log all events e.g.['onPostStart', 'onPostStop', 'response', 'request-error']
. Set tofalse/null
to disable all events. Even though there is norequest-error
Hapi Event, the options enables the logging of failed requests.[mergeHapiLogData]
- When enabled, Hapi-pino will merge the data received from Hapi's logging interface (server.log(tags, data)
orrequest.log(tags, data)
) into Pino's logged attributes at root level. If data is a string, it will be used as the value for themsg
key. Default isfalse
, in which case data will be logged under adata
key. E.g.server.log(['info'], {hello: 'world'}) // with mergeHapiLogData: true { level: 30, hello: 'world', ...} // with mergeHapiLogData: false (Default) { level: 30, data: { hello: 'world' }}
[ignorePaths]
- Takes an array of string routes and disables logging for each. Useful for health checks or any route that does not need logging. E.g['/health']
[level]
- Set the minumum level that Pino should log out. See Level. For example,{level: 'debug'}
would configure Pino to output alldebug
or higher events.[redact]
- Path to be redacted in the log lines. See the log redaction docs for more details.
hapi-pino decorates the Hapi server with server.logger()
, which is a function that returns the current instance of
pino. See its doc for the way to actual log.
hapi-pino decorates the Hapi request with:
request.logger
, which is an instance of pino bound to the current request, so you can trace all the logs of a given request. See pino doc for the way to actual log.
hapi-pino listens to some Hapi events:
'onRequest'
, to create a request-specific child logger'response'
, to log at'info'
level when a request is completed'request'
, to support logging via the Hapirequest.log()
method and to log at'warn'
level when a request errors or when request received contains an invalidaccept-encoding
header, seetags
andallTags
options.'log'
, to support logging via the Hapiserver.log()
method and to log in case of an internal server event, seetags
andallTags
options.'onPostStart'
, to log when the server is started'onPostStop'
, to log when the server is stopped
This project was kindly sponsored by nearForm.
MIT