logbook
Version:
Log all data passing through process.stdout and process.stderr
120 lines (98 loc) • 2.83 kB
JavaScript
var logbook = module.exports = {};
require('colors');
//helper grabs original process.std[out|err] functions before patching
var helper = logbook.helper = require('./helper');
var fs = require('fs');
var path = require('path');
var loggers = logbook.loggers = {};
var addLogger = function(name, path) {
if(loggers[name])
return helper.fatal("Logger already exists '%s'", name);
var logger;
try {
logger = require(path);
} catch(err) {
return helper.fatal("Failed to require logger '%s'\n %s", name, err.stack||err);
}
if(typeof logger.send !== "function")
return helper.fatal("Logger '%s' is missing the 'send' function", name);
logger.name = name;
loggers[name] = logger;
};
// load all local plugins
var loggersDir = path.join(__dirname, 'loggers');
fs.readdirSync(loggersDir).forEach(function(file) {
var name = file.replace(/\.js$/,'');
addLogger(name, path.join(loggersDir, file));
});
// load all external plugins
var modulesDir = path.join(__dirname, '..');
fs.readdirSync(modulesDir).forEach(function(module) {
if(/^logbook-([\w-]+)$/.test(module))
addLogger(RegExp.$1, path.join(modulesDir, module));
});
// intercept console logs and errors and call all handlers
var makeWriteFn = function(type) {
return function(buffer) {
//check for active core handler
for(var l in loggers) {
var logger = loggers[l];
if(logger.config[type])
logger.send(type, buffer);
}
//check for user handlers
handlers.forEach(function(fn) {
fn(type, buffer);
});
};
};
var sharedDefaults = {
log: false,
err: false
};
var isConfigured = false;
function enabled() {
return this.log || this.err;
}
//public methods
logbook.configure = function(object) {
if(isConfigured) {
helper.fatal("Logbook can not be configured more than once");
return logbook;
}
// monkey patch std[out|err]
process.stdout.write = makeWriteFn('log');
process.stderr.write = makeWriteFn('err');
//config each handler
for(var name in loggers) {
var logger = loggers[name];
if(!logger.config)
logger.config = {};
//apply changes
helper._.defaults(logger.config, sharedDefaults);
helper._.extend(logger.config, object[name] || {});
Object.defineProperty(logger.config, 'enabled', { get: enabled });
//configure logger if able
if(logger.configure) {
logger.configure();
}
//display enabled loggers
if(logger.config.enabled) {
helper.info("'%s' enabled", logger.name);
}
}
isConfigured = true;
return logbook;
};
//user handlers
var handlers = [];
logbook.add = function(fn) {
handlers.push(fn);
return logbook;
};
logbook.remove = function(fn) {
var i = handlers.indexOf(fn);
if(i === -1) return logbook;
handlers.splice(i,1);
return logbook;
};