defaultRequestFilter = function (req, propName) {
return req[propName];
}n/a
defaultResponseFilter = function (res, propName) {
return res[propName];
}n/a
defaultSkip = function () {
return false;
}n/a
function errorLogger(options) {
ensureValidOptions(options);
options.requestWhitelist = options.requestWhitelist || exports.requestWhitelist;
options.requestFilter = options.requestFilter || exports.defaultRequestFilter;
options.winstonInstance = options.winstonInstance || (new winston.Logger ({ transports: options.transports }));
options.msg = options.msg || 'middlewareError';
options.baseMeta = options.baseMeta || {};
options.metaField = options.metaField || null;
options.level = options.level || 'error';
options.dynamicMeta = options.dynamicMeta || function(req, res, err) { return null; };
// Using mustache style templating
var template = _.template(options.msg, {
interpolate: /\{\{([\s\S]+?)\}\}/g
});
return function (err, req, res, next) {
// Let winston gather all the error data.
var exceptionMeta = winston.exception.getAllInfo(err);
exceptionMeta.req = filterObject(req, options.requestWhitelist, options.requestFilter);
if(options.dynamicMeta) {
var dynamicMeta = options.dynamicMeta(req, res, err);
exceptionMeta = _.assign(exceptionMeta, dynamicMeta);
}
if (options.metaField) {
var newMeta = {};
newMeta[options.metaField] = exceptionMeta;
exceptionMeta = newMeta;
}
exceptionMeta = _.assign(exceptionMeta, options.baseMeta);
// This is fire and forget, we don't want logging to hold up the request so don't wait for the callback
options.winstonInstance.log(options.level, template({err: err, req: req, res: res}), exceptionMeta);
next(err);
};
}...
ignoredRoutes: [String] // Array of paths to ignore/skip logging. Overrides global ignoredRoutes for this instance
dynamicMeta: function(req, res) { return [Object]; } // Extract additional meta data from request or response (typically req.user
data if using passport). meta must be true for this function to be activated
```
### Error Logging
Use `expressWinston.errorLogger(options)` to create a middleware that log the errors
of the pipeline.
``` js
var router = require('./my-express-router');
app.use(router); // notice how the router goes first.
app.use(expressWinston.errorLogger({
transports: [
...function 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. ......
```
var winston = require('winston'),
expressWinston = require('express-winston');
```
### Request Logging
Use `expressWinston.logger(options)` to create a middleware to log your HTTP requests
.
``` js
var router = require('./my-express-router');
app.use(expressWinston.logger({
transports: [
new winston.transports.Console({
...