sails-hook-pino v1.1.2
Sails Hook Pino
Sails hook for pino logging
Install
npm install sails-hook-pinoA note on initialization
The order in which sails spins up user-defined hooks means that this logger will only initialize after most of the hooks have already been loaded. To get consistent logging output, it is recommended you disable the built-in logger hook. In .sailsrc:
{
"hooks": {
"logger": false
}
}With this setup, during initialization, sails.log will be a simple logger that will return errors and debug statements... in practice, with level=silly unlress there are errors during setup, sails will be silent until the pino logger hook is enabled. Once this hook has been loaded, you will start getting log statements.
API
All these methods can be accessed from sails.hooks.pino
instance- function() => PinoLogger: call to receive the base logger instancecreateChild- function(context) => SailsLogger: call to create a pino child that looks like the sails loggergetPinoLevel- function(string) => string: pass a logging level from sails to get the level in pinogetSailsLevel- function(string) => string: pass a logging level from pino to get hte level in sailsrequestLogger- function (key) => function(req, res, next): middleware to initializereq.log
Request logging
You can setup a child request logger under req.log with additional meta information.
You can provide a transactionId meta parameter from the (req, res) parameters; uuid.v4() will be used by default
This child logger has the pino req/res serializers installed so you can pass req or res as the first parameter
- ./config/http.js
exports.http = {
middleware: {
initializeLogger: (req, res, next) => {
const getTransactionKey = (req, res) => req.session.id
sails.hooks.pino.requestLogger(getTransactionKey)(req, res, next)
},
logAllTheThings: (req, res, next) => {
req.log(req)
next()
},
order: [
...etc...
initializeLogger, // place before `router`
logAllTheThings // optional, use to log requests
...etc...
]
}
}- ./api/controllers/SomeController.js
exports.SomeAction = (req, res, next) => {
req.log.info('A user has visited some action') // will log this message with `transactionId` requal to user's session id.
}- ./api/responses/notOk.js
module.exports = err => {
res.status(err.status)
res.end(err.message)
req.log(res) // log response for errors
}- ./api/respones/ok.js
module.exports = (data, options) => {
if (req.wantsJSON) {
res.json(data)
} else {
res.view(options, data)
}
res.log(res)
}Configuration
This module will pick up certain configuration options passed to sails.config.log:
level- default: "info"; {string} - level to loginspectOptions- default {}; {object} - forsailsprinting; options to pass toutil.inspect. For request logging, these will be run throughutil.inspectwhen sails logging is enabled.
Other options are passed via sails.config.pino:
sails- default: false; {boolean|object} - passtrueto replicate the look/feel of the build-in sails logger. You can pass additional options as well.sails.colors- the colors to use for the different levels.sails.prefixes- prefixes to prepend to log messagespretty- default: false; {boolean|object} - pass true to use pino'sprettyoutput. Passing an object will pass the options topino.pretty()see: API documentationpino- default: null; {object|null} - pass an object, this will be passed to thepinoconstructor see: API Documentation
Sample configuration
exports.pino = {
/*
pino: {
// pino constructor options here
// https://github.com/pinojs/pino/blob/v4.7.1/docs/API.md#constructor
},
pretty: {
// pino pretty options here
// https://github.com/pinojs/pino/blob/v4.7.1/docs/API.md#pretty
},
// this can be `true` to use same defaults that sails uses.
sails: {
colors: {
silly: 'rainbow',
verbose: 'cyan',
debug: 'blue',
info: 'green',
blank: 'white',
warn: 'yellow',
error: 'red',
crit: 'red'
},
prefixes: {
silly: 'silly: ',
verbose: 'verbose: ',
info: 'info: ',
blank: '',
debug: 'debug: ',
warn: 'warn: ',
error: 'error: ',
crit: 'CRITICAL: '
}
}
*/
}License
MIT