const { test } = require("tap"); const cluster = require("cluster"); const log4js = require("../../lib/log4js"); const recorder = require("../../lib/appenders/recording"); cluster.removeAllListeners(); log4js.configure({ appenders: { vcr: { type: "recording" } }, categories: { default: { appenders: ["vcr"], level: "debug" } }, disableClustering: true }); if (cluster.isMaster) { cluster.fork(); const masterLogger = log4js.getLogger("master"); const masterPid = process.pid; masterLogger.info("this is master"); cluster.on("exit", () => { const logEvents = recorder.replay(); test("cluster master", batch => { batch.test("only master events should be logged", t => { t.equal(logEvents.length, 1); t.equal(logEvents[0].categoryName, "master"); t.equal(logEvents[0].pid, masterPid); t.equal(logEvents[0].data[0], "this is master"); t.end(); }); batch.end(); }); }); } else { const workerLogger = log4js.getLogger("worker"); workerLogger.info("this is worker", new Error("oh dear")); const workerEvents = recorder.replay(); test("cluster worker", batch => { batch.test("should send events to its own appender", t => { t.equal(workerEvents.length, 1); t.equal(workerEvents[0].categoryName, "worker"); t.equal(workerEvents[0].data[0], "this is worker"); t.type(workerEvents[0].data[1], "Error"); t.match(workerEvents[0].data[1].stack, "Error: oh dear"); t.end(); }); batch.end(); }); // test sending a cluster-style log message process.send({ topic: "log4js:message", data: { cheese: "gouda" } }); cluster.worker.disconnect(); }