description and source-codeerrorLogger = function (opts) {
var logger, opts = opts || {}, format,
immediate = false,
parseUA = true,
excludes,
obfuscate,
obfuscatePlaceholder,
genReqId = defaultGenReqId,
levelFn = defaultLevelFn,
includesFn;
if (opts.logger) {
logger = opts.logger;
}
// default format
format = opts.format || ":remote-address :incoming :method :url HTTP/:http-version :status-code :res-headers[content-length] :
referer :user-agent[family] :user-agent[major].:user-agent[minor] :user-agent[os] :response-time ms";
delete opts.format; // don't pass it to bunyan
(typeof format != 'function') && (format = compile(format));
opts.hasOwnProperty('parseUA') && (parseUA = opts.parseUA, delete opts.parseUA);
if (opts.immediate) {
immediate = opts.immediate;
delete opts.immediate;
}
if (opts.levelFn) {
levelFn = opts.levelFn;
delete opts.levelFn;
}
if (opts.excludes) {
excludes = opts.excludes;
delete opts.excludes;
}
if (opts.obfuscate) {
obfuscate = opts.obfuscate;
obfuscatePlaceholder = opts.obfuscatePlaceholder || '[HIDDEN]';
delete opts.obfuscate;
delete opts.obfuscatePlaceholder;
}
if (opts.includesFn) {
includesFn = opts.includesFn;
delete opts.includesFn;
}
if (opts.genReqId) {
genReqId = typeof genReqId == 'function' ? opts.genReqId : defaultGenReqId;
}else if (opts.hasOwnProperty('genReqId')) {
genReqId = false;
}
return function (err, req, res, next) {
var startTime = process.hrtime();
var app = req.app || res.app;
if (!logger) {
opts.name = (opts.name || app.settings.shortname || app.settings.name || app.settings.title || 'express');
opts.serializers = opts.serializers || {};
opts.serializers.req = opts.serializers.req || bunyan.stdSerializers.req;
opts.serializers.res = opts.serializers.res || bunyan.stdSerializers.res;
err && (opts.serializers.err = opts.serializers.err || bunyan.stdSerializers.err);
logger = bunyan.createLogger(opts);
}
var requestId;
if (genReqId)
requestId = genReqId(req);
var childLogger = requestId !== undefined ? logger.child({req_id: requestId}) : logger;
req.log = childLogger;
function logging(incoming) {
if (!incoming) {
res.removeListener('finish', logging);
res.removeListener('close', logging);
}
var status = res.statusCode,
method = req.method,
url = (req.baseUrl || '') + (req.url || '-'),
referer = req.header('referer') || req.header('referrer') || '-',
ua = parseUA ? useragent.parse(req.header('user-agent')) : req.header('user-agent'),
httpVersion = req.httpVersionMajor + '.' + req.httpVersionMinor,
hrtime = process.hrtime(startTime),
responseTime = hrtime[0] * 1e3 + hrtime[1] / 1e6,
ip, logFn;
ip = ip || req.ip || req.connection.remoteAddress ||
(req.socket && req.socket.remoteAddress) ||
(req.socket.socket && req.socket.socket.remoteAddress) ||
'127.0.0.1';
var meta = {
'remote-address': ip,
'ip': ip,
'method': method,
'url': url,
'referer': referer,
'user-agent': ua,
'body': req.body,
'short-body': undefined,
'http-version': httpVersion,
'response-time': responseTime,
"response-hrtime": hrtime,
"status-code": status,
'req-headers': req.headers,
'res-headers': res._headers,
'req': req,
'res': res,
'incoming':incoming?'-->':'<--'
}; ...