Merge pull request #135 from jmav/master

auto level detection from @jmav
This commit is contained in:
Gareth Jones 2013-05-15 23:52:27 -07:00
commit aa4f7c071b
2 changed files with 133 additions and 91 deletions

View File

@ -1,14 +1,46 @@
var log4js = require('./lib/log4js'); //The connect/express logger was added to log4js by danbell. This allows connect/express servers to log using log4js.
log4js.addAppender(log4js.fileAppender('cheese.log'), 'cheese'); //https://github.com/nomiddlename/log4js-node/wiki/Connect-Logger
var logger = log4js.getLogger('cheese'); // load modules
logger.setLevel('INFO'); var log4js = require('log4js');
var express = require("express");
var app = express();
var app = require('express').createServer(); //config
log4js.configure({
appenders: [
{ type: 'console' },
{ type: 'file', filename: 'logs/log4jsconnect.log', category: 'log4jslog' }
]
});
//define logger
var logger = log4js.getLogger('log4jslog');
// set at which time msg is logged print like: only on error & above
// logger.setLevel('ERROR');
//express app
app.configure(function() { app.configure(function() {
app.use(log4js.connectLogger(logger, { level: log4js.levels.INFO })); app.use(express.favicon(''));
// app.use(log4js.connectLogger(logger, { level: log4js.levels.INFO }));
// app.use(log4js.connectLogger(logger, { level: 'auto', format: ':method :url :status' }));
//### AUTO LEVEL DETECTION
//http responses 3xx, level = WARN
//http responses 4xx & 5xx, level = ERROR
//else.level = INFO
app.use(log4js.connectLogger(logger, { level: 'auto' }));
}); });
app.get('*', function(req,res) {
res.send('hello world\n <a href="/cheese">cheese</a>\n'); //route
app.get('/', function(req,res) {
res.send('hello world');
}); });
//start app
app.listen(5000); app.listen(5000);
console.log('server runing at localhost:5000');
console.log('Simulation of normal response: goto localhost:5000');
console.log('Simulation of error response: goto localhost:5000/xxx');

View File

@ -5,7 +5,7 @@ var levels = require("./levels");
* Options: * Options:
* *
* - `format` Format string, see below for tokens * - `format` Format string, see below for tokens
* - `level` A log4js levels instance. * - `level` A log4js levels instance. Supports also 'auto'
* *
* Tokens: * Tokens:
* *
@ -26,7 +26,7 @@ var levels = require("./levels");
* @api public * @api public
*/ */
function getLogger(logger4js, options) { function getLogger(logger4js, options) {
if ('object' == typeof options) { if ('object' == typeof options) {
options = options || {}; options = options || {};
} else if (options) { } else if (options) {
@ -47,8 +47,7 @@ function getLogger(logger4js, options) {
// nologs // nologs
if (nolog && nolog.test(req.originalUrl)) return next(); if (nolog && nolog.test(req.originalUrl)) return next();
if (thislogger.isLevelEnabled(level) || options.level === 'auto') {
if (thislogger.isLevelEnabled(level)) {
var start = +new Date var start = +new Date
, statusCode , statusCode
@ -65,6 +64,15 @@ function getLogger(logger4js, options) {
res.writeHead(code, headers); res.writeHead(code, headers);
res.__statusCode = statusCode = code; res.__statusCode = statusCode = code;
res.__headers = headers || {}; res.__headers = headers || {};
//status code response level handling
if(options.level === 'auto'){
level = levels.INFO;
if(code >= 300) level = levels.WARN;
if(code >= 400) level = levels.ERROR;
} else {
level = levels.toLevel(options.level, levels.INFO)
}
}; };
// proxy end to output a line to the provided logger. // proxy end to output a line to the provided logger.
@ -72,18 +80,20 @@ function getLogger(logger4js, options) {
res.end = end; res.end = end;
res.end(chunk, encoding); res.end(chunk, encoding);
res.responseTime = +new Date - start; res.responseTime = +new Date - start;
if ('function' == typeof fmt) { if (thislogger.isLevelEnabled(level)) {
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, req, res); });
if (line) thislogger.log(level, line); if (line) thislogger.log(level, line);
} else { } else {
thislogger.log(level, format(fmt, req, res)); thislogger.log(level, format(fmt, req, res));
} }
}
}; };
} }
//ensure next gets always called //ensure next gets always called
next(); next();
}; };
} }
/** /**
@ -96,7 +106,7 @@ function getLogger(logger4js, options) {
* @api private * @api private
*/ */
function format(str, req, res) { function format(str, req, res) {
return str return str
.replace(':url', req.originalUrl) .replace(':url', req.originalUrl)
.replace(':method', req.method) .replace(':method', req.method)
@ -114,7 +124,7 @@ function format(str, req, res) {
? (res._headers[field.toLowerCase()] || res.__headers[field]) ? (res._headers[field.toLowerCase()] || res.__headers[field])
: (res.__headers && res.__headers[field]); : (res.__headers && res.__headers[field]);
}); });
} }
/** /**
* Return RegExp Object about nolog * Return RegExp Object about nolog
@ -143,7 +153,7 @@ function format(str, req, res) {
* 3.1 ["\\.jpg$", "\\.png", "\\.gif"] * 3.1 ["\\.jpg$", "\\.png", "\\.gif"]
* SAME AS "\\.jpg|\\.png|\\.gif" * SAME AS "\\.jpg|\\.png|\\.gif"
*/ */
function createNoLogCondition(nolog, type) { function createNoLogCondition(nolog, type) {
if(!nolog) return null; if(!nolog) return null;
type = type || ''; type = type || '';
@ -163,6 +173,6 @@ function createNoLogCondition(nolog, type) {
var regexps = nolog.map(function(o){ return createNoLogCondition(o, 'string')}); var regexps = nolog.map(function(o){ return createNoLogCondition(o, 'string')});
return new RegExp(regexps.join('|')); return new RegExp(regexps.join('|'));
} }
} }
exports.connectLogger = getLogger; exports.connectLogger = getLogger;