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:
John Engler
2014-04-05 15:12:45 -07:00
parent 2a38f460dc
commit 3ec9811b5e
+10 -10
View File
@@ -56,6 +56,7 @@ var events = require('events')
, appenders = {} , appenders = {}
, loggers = {} , loggers = {}
, appenderMakers = {} , appenderMakers = {}
, appenderShutdowns = {}
, defaultConfig = { , defaultConfig = {
appenders: [ appenders: [
{ type: "console" } { type: "console" }
@@ -299,24 +300,23 @@ function loadAppender(appender) {
appenderModule = require(appender); appenderModule = require(appender);
} }
module.exports.appenders[appender] = appenderModule.appender.bind(appenderModule); module.exports.appenders[appender] = appenderModule.appender.bind(appenderModule);
if (appenderModule.shutdown) {
appenderShutdowns[appender] = appenderModule.shutdown.bind(appenderModule);
}
appenderMakers[appender] = appenderModule.configure.bind(appenderModule); appenderMakers[appender] = appenderModule.configure.bind(appenderModule);
} }
function shutdown(cb) { function shutdown(cb) {
var allAppenders = Object.keys(appenders).reduce( var shutdownFunctions = Object.keys(appenderShutdowns).reduce(
function(accum, category) { function(accum, category) {
return accum.concat(appenders[category]); return accum.concat(appenderShutdowns[category]);
}, []); }, []);
async.forEach( async.forEach(
allAppenders, shutdownFunctions,
function(appender, done) { function(shutdownFn, done) {
if (appender.shutdown) { shutdownFn(done);
appender.shutdown(done);
} else {
done();
}
}, },
function() { process.nextTick(cb); } cb
); );
} }