description and source-codefunction pinoLogger(opts, stream) {
if (opts && opts._writableState) {
stream = opts
opts = null
}
opts = opts || {}
opts.serializers = opts.serializers || {}
opts.serializers.req = opts.serializers.req || asReqValue
opts.serializers.res = opts.serializers.res || pino.stdSerializers.res
opts.serializers.err = opts.serializers.err || pino.stdSerializers.err
var useLevel = opts.useLevel || 'info'
delete opts.useLevel
var theStream = opts.stream || stream
delete opts.stream
var logger = wrapChild(opts, theStream)
var genReqId = reqIdGenFactory(opts.genReqId)
loggingMiddleware.logger = logger
return loggingMiddleware
function onResFinished (err) {
this.removeListener('finish', onResFinished)
this.removeListener('error', onResFinished)
var log = this.log
var responseTime = Date.now() - this.startTime
if (err) {
log.error({
res: this,
err: err,
responseTime: responseTime
}, 'request errored')
return
}
log[useLevel]({
res: this,
responseTime: responseTime
}, 'request completed')
}
function loggingMiddleware (req, res, next) {
req.id = genReqId(req)
req.log = res.log = logger.child({req: req})
res.startTime = Date.now()
if (!req.res) { req.res = res }
res.on('finish', onResFinished)
res.on('error', onResFinished)
if (next) {
next()
}
}
}