61beac28d3
+ lib/appenders/clustered.js + test/clusteredAppender-test.js Instead os using sockets (like multiprocess) or dead and unmaintained hook.io, Clustered appender uses process.send(message) / worker.on('message', callback) mechanisms for transporting data between worker processes and master logger. Master logger takes an "appenders" array of actual appenders that are triggered when worker appenders send some data. This guarantees sequential writes to appenders, so the log messages are not mixed in single lines of log.
117 lines
2.7 KiB
JavaScript
Executable File
117 lines
2.7 KiB
JavaScript
Executable File
"use strict";
|
|
var assert = require('assert');
|
|
var vows = require('vows');
|
|
var layouts = require('../lib/layouts');
|
|
var sandbox = require('sandboxed-module');
|
|
var LoggingEvent = require('../lib/logger').LoggingEvent;
|
|
var cluster = require('cluster');
|
|
|
|
vows.describe('log4js cluster appender').addBatch({
|
|
'when in master mode': {
|
|
topic: function() {
|
|
|
|
var registeredClusterEvents = [];
|
|
var loggingEvents = [];
|
|
|
|
// Fake cluster module, so no cluster listeners be really added
|
|
var fakeCluster = {
|
|
|
|
on: function(event, callback) {
|
|
registeredClusterEvents.push(event);
|
|
},
|
|
|
|
isMaster: true,
|
|
isWorker: false,
|
|
|
|
};
|
|
|
|
var fakeActualAppender = function(loggingEvent) {
|
|
loggingEvents.push(loggingEvent);
|
|
}
|
|
|
|
// Load appender and fake modules in it
|
|
var appenderModule = sandbox.require('../lib/appenders/clustered', {
|
|
requires: {
|
|
'cluster': fakeCluster,
|
|
}
|
|
});
|
|
|
|
var masterAppender = appenderModule.appender({
|
|
actualAppenders: [ fakeActualAppender ]
|
|
});
|
|
|
|
// Actual test - log message using masterAppender
|
|
masterAppender(new LoggingEvent('wovs', 'Info', ['masterAppender test']));
|
|
|
|
var returnValue = {
|
|
registeredClusterEvents: registeredClusterEvents,
|
|
loggingEvents: loggingEvents,
|
|
};
|
|
|
|
return returnValue;
|
|
},
|
|
|
|
"should register 'fork' event listener on 'cluster'": function(topic) {
|
|
assert.equal(topic.registeredClusterEvents[0], 'fork');
|
|
},
|
|
|
|
"should log using actual appender": function(topic) {
|
|
assert.equal(topic.loggingEvents[0].data[0], 'masterAppender test');
|
|
},
|
|
|
|
},
|
|
|
|
'when in worker mode': {
|
|
|
|
topic: function() {
|
|
|
|
var registeredProcessEvents = [];
|
|
|
|
// Fake cluster module, to fake we're inside a worker process
|
|
var fakeCluster = {
|
|
|
|
isMaster: false,
|
|
isWorker: true,
|
|
|
|
};
|
|
|
|
var fakeProcess = {
|
|
|
|
send: function(data) {
|
|
registeredProcessEvents.push(data);
|
|
},
|
|
|
|
};
|
|
|
|
// Load appender and fake modules in it
|
|
var appenderModule = sandbox.require('../lib/appenders/clustered', {
|
|
requires: {
|
|
'cluster': fakeCluster,
|
|
},
|
|
globals: {
|
|
'process': fakeProcess,
|
|
}
|
|
});
|
|
|
|
var workerAppender = appenderModule.appender();
|
|
|
|
// Actual test - log message using masterAppender
|
|
workerAppender(new LoggingEvent('wovs', 'Info', ['workerAppender test']));
|
|
|
|
var returnValue = {
|
|
registeredProcessEvents: registeredProcessEvents,
|
|
};
|
|
|
|
return returnValue;
|
|
|
|
},
|
|
|
|
"worker appender should call process.send" : function(topic) {
|
|
assert.equal(topic.registeredProcessEvents[0].type, '::log-message');
|
|
assert.equal(JSON.parse(topic.registeredProcessEvents[0].event).data[0], "workerAppender test");
|
|
}
|
|
|
|
}
|
|
|
|
}).exportTo(module);
|