|
|
|
/**
|
|
|
|
* Create a middleware that prints access logs via pelias-logger.
|
|
|
|
*/
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var url = require( 'url' );
|
|
|
|
|
|
|
|
var _ = require( 'lodash' );
|
|
|
|
var morgan = require( 'morgan' );
|
|
|
|
var through = require( 'through2' );
|
|
|
|
|
|
|
|
var peliasLogger = require( 'pelias-logger' ).get( 'api' );
|
|
|
|
var logging = require( '../helper/logging' );
|
|
|
|
|
|
|
|
function customRemoteAddr(req, res) {
|
|
|
|
if (logging.isDNT(req)) {
|
|
|
|
return '[IP removed]';
|
|
|
|
} else {
|
|
|
|
// from morgan default implementation
|
|
|
|
return req.ip ||
|
|
|
|
req._remoteAddress ||
|
|
|
|
(req.connection && req.connection.remoteAddress) ||
|
|
|
|
undefined;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function customURL(req, res) {
|
|
|
|
var parsedUrl = _.cloneDeep(req._parsedUrl);
|
|
|
|
parsedUrl.query = _.cloneDeep(req.query);
|
|
|
|
|
|
|
|
if (logging.isDNT(req)) {
|
|
|
|
// strip out sensitive fields in the query object
|
|
|
|
parsedUrl.query = logging.removeFields(parsedUrl.query);
|
|
|
|
|
|
|
|
// search will override the query object when formatting the url
|
|
|
|
// see https://nodejs.org/api/all.html#all_url_format_urlobj
|
|
|
|
delete parsedUrl.search;
|
|
|
|
}
|
|
|
|
|
|
|
|
return url.format(parsedUrl);
|
|
|
|
}
|
|
|
|
|
|
|
|
function createAccessLogger( logFormat ){
|
|
|
|
morgan.token('remote-addr', customRemoteAddr);
|
|
|
|
morgan.token('url', customURL);
|
|
|
|
|
|
|
|
return morgan( logFormat, {
|
|
|
|
stream: through( function write( ln, _, next ){
|
|
|
|
peliasLogger.info( ln.toString().trim() );
|
|
|
|
next();
|
|
|
|
})
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
customRemoteAddr: customRemoteAddr,
|
|
|
|
customURL: customURL,
|
|
|
|
createAccessLogger: createAccessLogger
|
|
|
|
};
|