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
options
or aformat
string.Options:
format
Format string, see below for tokensstream
Output stream, defaults to stdoutbuffer
Buffer duration, defaults to 1000ms when trueimmediate
Write 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
:status
Formats:
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'dev
concise 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