From 6146334d01dff1975a52c031f4c7471268cf755a Mon Sep 17 00:00:00 2001 From: e-cloud Date: Fri, 15 Jul 2016 19:47:16 +0800 Subject: [PATCH] refactor: connect-logger.js --- lib/connect-logger.js | 166 +++++++++++++++++++++--------------------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/lib/connect-logger.js b/lib/connect-logger.js index a8e5c54..f93652d 100755 --- a/lib/connect-logger.js +++ b/lib/connect-logger.js @@ -1,9 +1,9 @@ -"use strict"; -var levels = require("./levels"); -var DEFAULT_FORMAT = ':remote-addr - -' + +const levels = require('./levels'); +const DEFAULT_FORMAT = ':remote-addr - -' + ' ":method :url HTTP/:http-version"' + ' :status :content-length ":referrer"' + ' ":user-agent"'; + /** * Log requests with the given `options` or a `format` string. * @@ -11,6 +11,7 @@ var DEFAULT_FORMAT = ':remote-addr - -' + * * - `format` Format string, see below for tokens * - `level` A log4js levels instance. Supports also 'auto' + * - `nolog` A string or RegExp to exclude target logs * * Tokens: * @@ -26,13 +27,14 @@ var DEFAULT_FORMAT = ':remote-addr - -' + * - `:user-agent` * - `:status` * - * @param {String|Function|Object} format or options * @return {Function} + * @param logger4js + * @param options * @api public */ - function getLogger(logger4js, options) { - if ('object' == typeof options) { + /* eslint no-underscore-dangle:0 */ + if (typeof options === 'object') { options = options || {}; } else if (options) { options = { format: options }; @@ -40,35 +42,34 @@ function getLogger(logger4js, options) { options = {}; } - var thislogger = logger4js - , level = levels.toLevel(options.level, levels.INFO) - , fmt = options.format || DEFAULT_FORMAT - , nolog = options.nolog ? createNoLogCondition(options.nolog) : null; + const thisLogger = logger4js; + let level = levels.toLevel(options.level, levels.INFO); + const fmt = options.format || DEFAULT_FORMAT; + const nolog = options.nolog ? createNoLogCondition(options.nolog) : null; - return function (req, res, next) { + return (req, res, next) => { // mount safety if (req._logging) return next(); // nologs if (nolog && nolog.test(req.originalUrl)) return next(); - if (thislogger.isLevelEnabled(level) || options.level === 'auto') { - var start = new Date() - , statusCode - , writeHead = res.writeHead - , url = req.originalUrl; + if (thisLogger.isLevelEnabled(level) || options.level === 'auto') { + const start = new Date(); + const writeHead = res.writeHead; // flag as logging req._logging = true; // proxy for statusCode. - res.writeHead = function (code, headers) { + res.writeHead = (code, headers) => { res.writeHead = writeHead; res.writeHead(code, headers); - res.__statusCode = statusCode = code; + + res.__statusCode = code; res.__headers = headers || {}; - //status code response level handling + // status code response level handling if (options.level === 'auto') { level = levels.INFO; if (code >= 300) level = levels.WARN; @@ -78,29 +79,31 @@ function getLogger(logger4js, options) { } }; - //hook on end request to emit the log entry of the HTTP request. - res.on('finish', function () { + // hook on end request to emit the log entry of the HTTP request. + res.on('finish', () => { res.responseTime = new Date() - start; - //status code response level handling + // status code response level handling if (res.statusCode && options.level === 'auto') { level = levels.INFO; if (res.statusCode >= 300) level = levels.WARN; if (res.statusCode >= 400) level = levels.ERROR; } - if (thislogger.isLevelEnabled(level)) { - var combined_tokens = assemble_tokens(req, res, options.tokens || []); + + if (thisLogger.isLevelEnabled(level)) { + const combinedTokens = assembleTokens(req, res, options.tokens || []); + if (typeof fmt === 'function') { - var line = fmt(req, res, function (str) { return format(str, combined_tokens); }); - if (line) thislogger.log(level, line); + const line = fmt(req, res, str => format(str, combinedTokens)); + if (line) thisLogger.log(level, line); } else { - thislogger.log(level, format(fmt, combined_tokens)); + thisLogger.log(level, format(fmt, combinedTokens)); } } }); } - //ensure next gets always called - next(); + // ensure next gets always called + return next(); }; } @@ -110,16 +113,18 @@ function getLogger(logger4js, options) { * * @param {IncomingMessage} req * @param {ServerResponse} res - * @param {Array} custom_tokens + * @param {Array} customTokens * [{ token: string-or-regexp, replacement: string-or-replace-function }] * @return {Array} */ -function assemble_tokens(req, res, custom_tokens) { - var array_unique_tokens = function (array) { - var a = array.concat(); - for (var i = 0; i < a.length; ++i) { - for (var j = i + 1; j < a.length; ++j) { - if (a[i].token == a[j].token) { // not === because token can be regexp object +function assembleTokens(req, res, customTokens) { + const arrayUniqueTokens = array => { + const a = array.concat(); + for (let i = 0; i < a.length; ++i) { + for (let j = i + 1; j < a.length; ++j) { + // not === because token can be regexp object + /* eslint eqeqeq:0 */ + if (a[i].token == a[j].token) { a.splice(j--, 1); } } @@ -127,70 +132,68 @@ function assemble_tokens(req, res, custom_tokens) { return a; }; - var default_tokens = []; - default_tokens.push({ token: ':url', replacement: req.originalUrl }); - default_tokens.push({ token: ':protocol', replacement: req.protocol }); - default_tokens.push({ token: ':hostname', replacement: req.hostname }); - default_tokens.push({ token: ':method', replacement: req.method }); - default_tokens.push({ token: ':status', replacement: res.__statusCode || res.statusCode }); - default_tokens.push({ token: ':response-time', replacement: res.responseTime }); - default_tokens.push({ token: ':date', replacement: new Date().toUTCString() }); - default_tokens.push({ + const defaultTokens = []; + defaultTokens.push({ token: ':url', replacement: req.originalUrl }); + defaultTokens.push({ token: ':protocol', replacement: req.protocol }); + defaultTokens.push({ token: ':hostname', replacement: req.hostname }); + defaultTokens.push({ token: ':method', replacement: req.method }); + defaultTokens.push({ token: ':status', replacement: res.__statusCode || res.statusCode }); + defaultTokens.push({ token: ':response-time', replacement: res.responseTime }); + defaultTokens.push({ token: ':date', replacement: new Date().toUTCString() }); + defaultTokens.push({ token: ':referrer', replacement: req.headers.referer || req.headers.referrer || '' }); - default_tokens.push({ + defaultTokens.push({ token: ':http-version', - replacement: req.httpVersionMajor + '.' + req.httpVersionMinor + replacement: `${req.httpVersionMajor}.${req.httpVersionMinor}` }); - default_tokens.push({ - token: ':remote-addr', - replacement: req.headers['x-forwarded-for'] || - req.ip || - req._remoteAddress || - (req.socket && - (req.socket.remoteAddress || - (req.socket.socket && req.socket.socket.remoteAddress) - ) + defaultTokens.push({ + token: ':remote-addr', + replacement: req.headers['x-forwarded-for'] || + req.ip || + req._remoteAddress || + (req.socket && + (req.socket.remoteAddress || + (req.socket.socket && req.socket.socket.remoteAddress) ) - } - ); - default_tokens.push({ token: ':user-agent', replacement: req.headers['user-agent'] }); - default_tokens.push({ - token: ':content-length', - replacement: (res._headers && res._headers['content-length']) || - (res.__headers && res.__headers['Content-Length']) || - '-' - } - ); - default_tokens.push({ - token: /:req\[([^\]]+)\]/g, replacement: function (_, field) { + ) + }); + defaultTokens.push({ token: ':user-agent', replacement: req.headers['user-agent'] }); + defaultTokens.push({ + token: ':content-length', + replacement: (res._headers && res._headers['content-length']) || + (res.__headers && res.__headers['Content-Length']) || + '-' + }); + defaultTokens.push({ + token: /:req\[([^\]]+)\]/g, + replacement: function (_, field) { return req.headers[field.toLowerCase()]; } }); - default_tokens.push({ - token: /:res\[([^\]]+)\]/g, replacement: function (_, field) { + defaultTokens.push({ + token: /:res\[([^\]]+)\]/g, + replacement: function (_, field) { return res._headers ? (res._headers[field.toLowerCase()] || res.__headers[field]) : (res.__headers && res.__headers[field]); } }); - return array_unique_tokens(custom_tokens.concat(default_tokens)); + return arrayUniqueTokens(customTokens.concat(defaultTokens)); } /** * Return formatted log line. * * @param {String} str - * @param {IncomingMessage} req - * @param {ServerResponse} res + * @param {Array} tokens * @return {String} * @api private */ - function format(str, tokens) { - for (var i = 0; i < tokens.length; i++) { + for (let i = 0; i < tokens.length; i++) { str = str.replace(tokens[i].token, tokens[i].replacement); } return str; @@ -199,7 +202,7 @@ function format(str, tokens) { /** * Return RegExp Object about nolog * - * @param {String} nolog + * @param {String|Array} nolog * @return {RegExp} * @api private * @@ -224,7 +227,7 @@ function format(str, tokens) { * SAME AS "\\.jpg|\\.png|\\.gif" */ function createNoLogCondition(nolog) { - var regexp = null; + let regexp = null; if (nolog) { if (nolog instanceof RegExp) { @@ -236,11 +239,8 @@ function createNoLogCondition(nolog) { } if (Array.isArray(nolog)) { - var regexpsAsStrings = nolog.map( - function convertToStrings(o) { - return o.source ? o.source : o; - } - ); + // convert to strings + const regexpsAsStrings = nolog.map(reg => (reg.source ? reg.source : reg)); regexp = new RegExp(regexpsAsStrings.join('|')); } } @@ -248,4 +248,4 @@ function createNoLogCondition(nolog) { return regexp; } -exports.connectLogger = getLogger; +module.exports.connectLogger = getLogger;