|
|
'use strict'; |
|
|
|
|
|
const _ = require('lodash'); |
|
|
const morgan = require('morgan'); |
|
|
const bunyan = require('bunyan'); |
|
|
|
|
|
module.exports = setup; |
|
|
|
|
|
setup._authorizationToken = authorizationToken; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function setup(opts) { |
|
|
const options = _.defaults( |
|
|
{ |
|
|
morgan: { |
|
|
stream: { |
|
|
write: () => { |
|
|
|
|
|
} |
|
|
} |
|
|
}, |
|
|
log: req => req.logger.info.bind(req.logger), |
|
|
isDebug: req => req.logger.level() < bunyan.INFO, |
|
|
tokens: { |
|
|
'request-id': req => req.requestId, |
|
|
authorization: authorizationToken |
|
|
} |
|
|
}, |
|
|
opts |
|
|
); |
|
|
|
|
|
|
|
|
morgan.token('authorization', options.tokens.authorization); |
|
|
morgan.token('request-id', options.tokens['request-id']); |
|
|
|
|
|
return morgan(format, options.morgan); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function format(tokens, req, res) { |
|
|
const data = { |
|
|
time: tokens.date(req, res, 'iso'), |
|
|
method: tokens.method(req, res), |
|
|
url: tokens.url(req, res), |
|
|
status: tokens.status(req, res), |
|
|
authorization: tokens.authorization(req, res), |
|
|
'remote-user': tokens['remote-user'](req, res), |
|
|
'http-version': tokens['http-version'](req, res), |
|
|
'content-length': tokens.res(req, res, 'content-length'), |
|
|
'request-id': tokens['request-id'](req, res) |
|
|
}; |
|
|
|
|
|
if (options.isDebug(req)) { |
|
|
data.referrer = tokens.referrer(req, res); |
|
|
data['response-time'] = tokens['response-time'](req, res); |
|
|
data['user-agent'] = tokens['user-agent'](req, res); |
|
|
} |
|
|
|
|
|
options.log(req)(data, '[Express] Http access'); |
|
|
|
|
|
return data; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function authorizationToken(req) { |
|
|
const { token } = req; |
|
|
if (!token) return null; |
|
|
|
|
|
const parts = token.split('.'); |
|
|
|
|
|
if (parts.length < 2) return null; |
|
|
return `${parts[0]}.${parts[1]}.[...]`; |
|
|
} |
|
|
|