2021-12-03 17:58:48 +01:00

82 lines
2.1 KiB
JavaScript

// Copyright 2012 Mark Cavage, Inc. All rights reserved.
'use strict';
var assert = require('assert-plus');
var shallowCopy = require('./utils/shallowCopy');
///--- API
/**
* Sets up a child [bunyan](https://github.com/trentm/node-bunyan) logger with
* the current request id filled in, along with any other parameters you define.
*
* You can pass in no options to this, in which case only the request id will be
* appended, and no serializers appended (this is also the most performant); the
* logger created at server creation time will be used as the parent logger.
* This logger can be used normally, with [req.log](#request-api).
*
* This plugin does _not_ log each individual request. Use the Audit Logging
* plugin or a custom middleware for that use.
*
* @public
* @function requestLogger
* @param {Object} [options] - an options object
* @param {Array} [options.headers] - A list of headers to transfer from
* the request to top level props on the log.
* @returns {Function} Handler
* @example
* server.use(restify.plugins.requestLogger({
* properties: {
* foo: 'bar'
* },
* serializers: {...}
* }));
*/
function requestLogger(options) {
assert.optionalObject(options);
var opts = options || {};
var props;
if (opts.properties) {
props = shallowCopy(opts.properties);
} else {
props = {};
}
if (opts.serializers) {
props.serializers = opts.serializers;
}
var headersToCopy = opts.headers || [];
return function bunyan(req, res, next) {
if (!req.log && !opts.log) {
next();
return;
}
var log = req.log || opts.log;
props.req_id = req.getId();
headersToCopy.forEach(function forEach(k) {
if (req.headers[k]) {
props[k] = req.headers[k];
}
});
req.log = log.child(props, props.serializers ? false : true);
if (props.req_id) {
delete props.req_id;
}
next();
};
}
///--- Exports
module.exports = requestLogger;