description and source-codefunction logger(options) {
ensureValidOptions(options);
ensureValidLoggerOptions(options);
options.requestWhitelist = options.requestWhitelist || exports.requestWhitelist;
options.bodyWhitelist = options.bodyWhitelist || exports.bodyWhitelist;
options.bodyBlacklist = options.bodyBlacklist || exports.bodyBlacklist;
options.responseWhitelist = options.responseWhitelist || exports.responseWhitelist;
options.requestFilter = options.requestFilter || exports.defaultRequestFilter;
options.responseFilter = options.responseFilter || exports.defaultResponseFilter;
options.ignoredRoutes = options.ignoredRoutes || exports.ignoredRoutes;
options.winstonInstance = options.winstonInstance || (new winston.Logger ({ transports: options.transports }));
options.level = options.level || "info";
options.statusLevels = options.statusLevels || false;
options.msg = options.msg || "HTTP {{req.method}} {{req.url}}";
options.baseMeta = options.baseMeta || {};
options.metaField = options.metaField || null;
options.colorize = options.colorize || false;
options.expressFormat = options.expressFormat || false;
options.ignoreRoute = options.ignoreRoute || function () { return false; };
options.skip = options.skip || exports.defaultSkip;
options.dynamicMeta = options.dynamicMeta || function(req, res) { return null; };
return function (req, res, next) {
var coloredRes = {};
var currentUrl = req.originalUrl || req.url;
if (currentUrl && _.includes(options.ignoredRoutes, currentUrl)) return next();
if (options.ignoreRoute(req, res)) return next();
req._startTime = (new Date);
req._routeWhitelists = {
req: [],
res: [],
body: []
};
req._routeBlacklists = {
body: []
};
// Manage to get information from the response too, just like Connect.logger does:
var end = res.end;
res.end = function(chunk, encoding) {
res.responseTime = (new Date) - req._startTime;
res.end = end;
res.end(chunk, encoding);
req.url = req.originalUrl || req.url;
if (options.statusLevels) {
if (res.statusCode >= 100) { options.level = options.statusLevels.success || "info"; }
if (res.statusCode >= 400) { options.level = options.statusLevels.warn || "warn"; }
if (res.statusCode >= 500) { options.level = options.statusLevels.error || "error"; }
};
var meta = {};
if(options.meta !== false) {
var logData = {};
var requestWhitelist = options.requestWhitelist.concat(req._routeWhitelists.req || []);
var responseWhitelist = options.responseWhitelist.concat(req._routeWhitelists.res || []);
logData.res = res;
if (_.includes(responseWhitelist, 'body')) {
if (chunk) {
var isJson = (res._headers && res._headers['content-type']
&& res._headers['content-type'].indexOf('json') >= 0);
logData.res.body = bodyToString(chunk, isJson);
}
}
logData.req = filterObject(req, requestWhitelist, options.requestFilter);
logData.res = filterObject(res, responseWhitelist, options.responseFilter);
var bodyWhitelist = _.union(options.bodyWhitelist, (req._routeWhitelists.body || []));
var blacklist = _.union(options.bodyBlacklist, (req._routeBlacklists.body || []));
var filteredBody = null;
if ( req.body !== undefined ) {
if (blacklist.length > 0 && bodyWhitelist.length === 0) {
var whitelist = _.difference(Object.keys(req.body), blacklist);
filteredBody = filterObject(req.body, whitelist, options.requestFilter);
} else if (
requestWhitelist.indexOf('body') !== -1 &&
bodyWhitelist. ...