diff --git a/lib/connect-logger.js b/lib/connect-logger.js index 1f287c0..a53f7e0 100644 --- a/lib/connect-logger.js +++ b/lib/connect-logger.js @@ -1,8 +1,9 @@ "use strict"; var levels = require("./levels"); -var DEFAULT_FORMAT = ':remote-addr - -' + - ' ":method :url HTTP/:http-version"' + - ' :status :content-length ":referrer"' + +var _ = require('underscore'); +var 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. @@ -52,7 +53,7 @@ function getLogger(logger4js, options) { // nologs if (nolog && nolog.test(req.originalUrl)) return next(); if (thislogger.isLevelEnabled(level) || options.level === 'auto') { - + var start = new Date() , statusCode , writeHead = res.writeHead @@ -60,7 +61,7 @@ function getLogger(logger4js, options) { // flag as logging req._logging = true; - + // proxy for statusCode. res.writeHead = function(code, headers){ res.writeHead = writeHead; @@ -77,7 +78,7 @@ function getLogger(logger4js, options) { level = levels.toLevel(options.level, levels.INFO); } }; - + //hook on end request to emit the log entry of the HTTP request. res.on('finish', function() { res.responseTime = new Date() - start; @@ -88,21 +89,68 @@ function getLogger(logger4js, options) { if(res.statusCode >= 400) level = levels.ERROR; } if (thislogger.isLevelEnabled(level)) { + var combined_tokens = assemble_tokens(req, res, options.tokens || []); if (typeof fmt === 'function') { - var line = fmt(req, res, function(str){ return format(str, req, res); }); + var line = fmt(req, res, function(str){ return format(str, combined_tokens); }); if (line) thislogger.log(level, line); } else { - thislogger.log(level, format(fmt, req, res)); + thislogger.log(level, format(fmt, combined_tokens)); } } }); } - + //ensure next gets always called next(); }; } +/** + * Adds custom {token, replacement} objects to defaults, overwriting the defaults if any tokens clash + * + * @param {IncomingMessage} req + * @param {ServerResponse} res + * @param {Array} custom_tokens [{ 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