Connect
compile()
Compile fmt into a function.
Source
function compile(fmt) {
fmt = fmt.replace(/"/g, '\\"');
var js = ' return "' + fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, function(_, name, arg){
return '"\n + (tokens["' + name + '"](req, res, "' + arg + '") || "-") + "';
}) + '";'
return new Function('tokens, req, res', js);
};exports.token()
Define a token function with the given name,
and callback fn(req, res).
Source
exports.token = function(name, fn) {
exports[name] = fn;
return this;
};exports.format()
Define a fmt with the given name.
Source
exports.format = function(name, str){
exports[name] = str;
return this;
};Default format.
Source
exports.format('default', ':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"');Short format.
Source
exports.format('short', ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms');Tiny format.
Source
exports.format('tiny', ':method :url :status :res[content-length] - :response-time ms');dev (colored)
Source
exports.format('dev', function(tokens, req, res){
var status = res.statusCode
, len = parseInt(res.getHeader('Content-Length'), 10)
, color = 32;
if (status >= 500) color = 31
else if (status >= 400) color = 33
else if (status >= 300) color = 36;
len = isNaN(len)
? ''
: len = ' - ' + bytes(len);
return '\x1b[90m' + req.method
+ ' ' + req.originalUrl + ' '
+ '\x1b[' + color + 'm' + res.statusCode
+ ' \x1b[90m'
+ (new Date - req._startTime)
+ 'ms' + len
+ '\x1b[0m';
});request url
Source
exports.token('url', function(req){
return req.originalUrl || req.url;
});request method
Source
exports.token('method', function(req){
return req.method;
});response time in milliseconds
Source
exports.token('response-time', function(req){
return String(Date.now() - req._startTime);
});UTC date
Source
exports.token('date', function(){
return new Date().toUTCString();
});response status code
Source
exports.token('status', function(req, res){
return res.headerSent ? res.statusCode : null;
});normalized referrer
Source
exports.token('referrer', function(req){
return req.headers['referer'] || req.headers['referrer'];
});remote address
Source
exports.token('remote-addr', function(req){
if (req.ip) return req.ip;
if (req._remoteAddress) return req._remoteAddress;
var sock = req.socket;
if (sock.socket) return sock.socket.remoteAddress;
return sock.remoteAddress;
});HTTP version
Source
exports.token('http-version', function(req){
return req.httpVersionMajor + '.' + req.httpVersionMinor;
});UA string
Source
exports.token('user-agent', function(req){
return req.headers['user-agent'];
});request header
Source
exports.token('req', function(req, res, field){
return req.headers[field.toLowerCase()];
});response header
Source
exports.token('res', function(req, res, field){
return (res._headers || {})[field.toLowerCase()];
});
Logger:
Log requests with the given
optionsor aformatstring.Options:
formatFormat string, see below for tokensstreamOutput stream, defaults to stdoutbufferBuffer duration, defaults to 1000ms when trueimmediateWrite log line on request instead of response (for response times)Tokens:
:req[header]ex::req[Accept]:res[header]ex::res[Content-Length]:http-version:response-time:remote-addr:date:method:url:referrer:user-agent:statusFormats:
Pre-defined formats that ship with connect:
default':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'short':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms'tiny':method :url :status :res[content-length] - :response-time ms'devconcise output colored by response status for development useExamples:
Defining Tokens:
To define a token, simply invoke
connect.logger.token()with thename and a callback function. The value returned is then available
as ":type" in this case.
Defining Formats:
All default formats are defined this way, however it's public API as well:
Source