Update log4js module to expose a shutdown function.
loadAppender will check for a shutdown function exposed by a loaded appender. If present, it will be cached so that the shutdown function can execute it. The intent here is that a Node application would not invoked process.exit until after the log4js shutdown callback returns.
This commit is contained in:
@@ -56,6 +56,7 @@ var events = require('events')
|
||||
, appenders = {}
|
||||
, loggers = {}
|
||||
, appenderMakers = {}
|
||||
, appenderShutdowns = {}
|
||||
, defaultConfig = {
|
||||
appenders: [
|
||||
{ type: "console" }
|
||||
@@ -299,24 +300,23 @@ function loadAppender(appender) {
|
||||
appenderModule = require(appender);
|
||||
}
|
||||
module.exports.appenders[appender] = appenderModule.appender.bind(appenderModule);
|
||||
if (appenderModule.shutdown) {
|
||||
appenderShutdowns[appender] = appenderModule.shutdown.bind(appenderModule);
|
||||
}
|
||||
appenderMakers[appender] = appenderModule.configure.bind(appenderModule);
|
||||
}
|
||||
|
||||
function shutdown(cb) {
|
||||
var allAppenders = Object.keys(appenders).reduce(
|
||||
var shutdownFunctions = Object.keys(appenderShutdowns).reduce(
|
||||
function(accum, category) {
|
||||
return accum.concat(appenders[category]);
|
||||
return accum.concat(appenderShutdowns[category]);
|
||||
}, []);
|
||||
async.forEach(
|
||||
allAppenders,
|
||||
function(appender, done) {
|
||||
if (appender.shutdown) {
|
||||
appender.shutdown(done);
|
||||
} else {
|
||||
done();
|
||||
}
|
||||
shutdownFunctions,
|
||||
function(shutdownFn, done) {
|
||||
shutdownFn(done);
|
||||
},
|
||||
function() { process.nextTick(cb); }
|
||||
cb
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user