moved cluster support into core, removed clustered appender, multiprocess appender

This commit is contained in:
Gareth Jones
2013-08-24 20:46:10 +10:00
parent d8cf8cb2dc
commit eabcaf8aef
5 changed files with 185 additions and 783 deletions

View File

@@ -48,6 +48,7 @@
*/
var debug = require('./debug')('core')
, fs = require('fs')
, cluster = require('cluster')
, util = require('util')
, layouts = require('./layouts')
, levels = require('./levels')
@@ -64,16 +65,57 @@ var debug = require('./debug')('core')
}
};
function serialise(event) {
return JSON.stringify(event);
}
function deserialise(serialised) {
var event;
try {
event = JSON.parse(serialised);
event.startTime = new Date(event.startTime);
event.level = levels.toLevel(event.level.levelStr);
} catch(e) {
event = {
startTime: new Date(),
category: 'log4js',
level: levels.ERROR,
data: [ 'Unable to parse log:', serialised ]
};
}
return event;
}
//in a multi-process node environment, worker loggers will use
//process.send
cluster.on('fork', function(worker) {
debug('listening to worker: ' + worker);
worker.on('message', function(message) {
if (message.type && message.type === '::log4js-message') {
debug("received message: " + message.event);
dispatch(deserialise(message.event));
}
});
});
/**
* Get a logger instance.
* @param {String} categoryName name of category to log to.
* @param {String} category to log to.
* @return {Logger} instance of logger for the category
* @static
*/
function getLogger (categoryName) {
debug("getLogger(" + categoryName + ")");
function getLogger (category) {
debug("getLogger(" + category + ")");
return new Logger(dispatch, categoryName || 'default');
return new Logger(
cluster.isMaster ? dispatch : workerDispatch,
category || 'default'
);
}
function workerDispatch(event) {
process.send({ type: "::log4js-message", event: serialise(event) });
}
/**
@@ -92,67 +134,6 @@ function dispatch(event) {
}
}
/*
var configState = {};
function loadConfigurationFile(filename) {
if (filename) {
return JSON.parse(fs.readFileSync(filename, "utf8"));
}
return undefined;
}
function configureOnceOff(config, options) {
if (config) {
try {
configureAppenders(config.appenders, options);
configureLevels(config.levels);
if (config.replaceConsole) {
replaceConsole();
} else {
restoreConsole();
}
} catch (e) {
throw new Error(
"Problem reading log4js config " + util.inspect(config) +
". Error was \"" + e.message + "\" (" + e.stack + ")"
);
}
}
}
function reloadConfiguration() {
var mtime = getMTime(configState.filename);
if (!mtime) return;
if (configState.lastMTime && (mtime.getTime() > configState.lastMTime.getTime())) {
configureOnceOff(loadConfigurationFile(configState.filename));
}
configState.lastMTime = mtime;
}
function getMTime(filename) {
var mtime;
try {
mtime = fs.statSync(configState.filename).mtime;
} catch (e) {
getLogger('log4js').warn('Failed to load configuration file ' + filename);
}
return mtime;
}
function initReloadConfiguration(filename, options) {
if (configState.timerId) {
clearInterval(configState.timerId);
delete configState.timerId;
}
configState.filename = filename;
configState.lastMTime = getMTime(filename);
configState.timerId = setInterval(reloadConfiguration, options.reloadSecs*1000);
}
*/
function load(file) {
return JSON.parse(fs.readFileSync(file, "utf-8"));
}
@@ -178,25 +159,6 @@ function configure(configurationFileOrObject) {
validateCategories(config.categories);
categories = config.categories;
/*
var config = configurationFileOrObject;
config = config || process.env.LOG4JS_CONFIG;
options = options || {};
if (config === undefined || config === null || typeof(config) === 'string') {
if (options.reloadSecs) {
initReloadConfiguration(config, options);
}
config = loadConfigurationFile(config) || defaultConfig;
} else {
if (options.reloadSecs) {
getLogger('log4js').warn(
'Ignoring configuration reload parameter for "object" configuration.'
);
}
}
configureOnceOff(config, options);
*/
}
function validateCategories(cats) {
@@ -259,48 +221,9 @@ function loadAppender(appender) {
appenderMakers[appender] = appenderModule.configure.bind(appenderModule);
}
/*
var originalConsoleFunctions = {
log: console.log,
debug: console.debug,
info: console.info,
warn: console.warn,
error: console.error
};
function replaceConsole(logger) {
function replaceWith(fn) {
return function() {
fn.apply(logger, arguments);
};
}
logger = logger || getLogger("console");
['log','debug','info','warn','error'].forEach(function (item) {
console[item] = replaceWith(item === 'log' ? logger.info : logger[item]);
});
}
function restoreConsole() {
['log', 'debug', 'info', 'warn', 'error'].forEach(function (item) {
console[item] = originalConsoleFunctions[item];
});
}
*/
module.exports = {
getLogger: getLogger,
configure: configure,
/*
replaceConsole: replaceConsole,
restoreConsole: restoreConsole,
levels: levels,
layouts: layouts,
appenders: {},
appenderMakers: appenderMakers,
connectLogger: require('./connect-logger').connectLogger
*/
};
//set ourselves up