From 5ee0429bbbc6537b2e191d5ca780d0cbe1bc4b60 Mon Sep 17 00:00:00 2001 From: Richard Hinkamp Date: Wed, 9 Jun 2021 21:58:00 +0200 Subject: [PATCH] fix: handle double shutdown() fixes #1005 --- lib/log4js.js | 7 +++++++ test/tap/fileAppender-test.js | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/lib/log4js.js b/lib/log4js.js index fdd48c84..7c2783ad 100644 --- a/lib/log4js.js +++ b/lib/log4js.js @@ -82,6 +82,13 @@ function configure(configurationFileOrObject) { * as the first argument. */ function shutdown(cb) { + if (!enabled) { + if (cb) { + cb(undefined); + } + return null; + } + debug("Shutdown called. Disabling all log writing."); // First, disable all writing to appenders. This prevents appenders from // not being able to be drained because of run-away log writes. diff --git a/test/tap/fileAppender-test.js b/test/tap/fileAppender-test.js index be1791c2..1947568c 100644 --- a/test/tap/fileAppender-test.js +++ b/test/tap/fileAppender-test.js @@ -376,5 +376,31 @@ test("log4js fileAppender", batch => { t.end(); }); + batch.test("with double shutdown", async t => { + const testFile = path.join(__dirname, "fa-default-test.log"); + await removeFile(testFile); + + log4js.configure({ + appenders: { test: { type: "file", filename: testFile } }, + categories: { default: { appenders: ["test"], level: "trace" } } + }); + const logger = log4js.getLogger("default-settings"); + + logger.info("1"); + logger.info("2"); + logger.info("3"); + + await new Promise(resolve => log4js.shutdown(resolve)); + await new Promise(resolve => log4js.shutdown(resolve)); + const fileContents = await fs.readFile(testFile, "utf8"); + // 3 lines of output, plus the trailing newline. + t.equal(fileContents.split(EOL).length, 4); + t.match( + fileContents, + /\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}] \[INFO] default-settings - / + ); + t.end(); + }); + batch.end(); });