|
|
|
@ -50,12 +50,14 @@ var events = require('events')
|
|
|
|
|
, util = require('util')
|
|
|
|
|
, layouts = require('./layouts')
|
|
|
|
|
, levels = require('./levels')
|
|
|
|
|
, LoggingEvent = require('./logger').LoggingEvent
|
|
|
|
|
, Logger = require('./logger').Logger
|
|
|
|
|
, loggerModule = require('./logger')
|
|
|
|
|
, LoggingEvent = loggerModule.LoggingEvent
|
|
|
|
|
, Logger = loggerModule.Logger
|
|
|
|
|
, ALL_CATEGORIES = '[all]'
|
|
|
|
|
, appenders = {}
|
|
|
|
|
, loggers = {}
|
|
|
|
|
, appenderMakers = {}
|
|
|
|
|
, appenderShutdowns = {}
|
|
|
|
|
, defaultConfig = {
|
|
|
|
|
appenders: [
|
|
|
|
|
{ type: "console" }
|
|
|
|
@ -299,24 +301,39 @@ 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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Shutdown all log appenders. This will first disable all writing to appenders
|
|
|
|
|
* and then call the shutdown function each appender.
|
|
|
|
|
*
|
|
|
|
|
* @params {Function} cb - The callback to be invoked once all appenders have
|
|
|
|
|
* shutdown. If an error occurs, the callback will be given the error object
|
|
|
|
|
* as the first argument.
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
function shutdown(cb) {
|
|
|
|
|
var allAppenders = Object.keys(appenders).reduce(
|
|
|
|
|
// First, disable all writing to appenders. This prevents appenders from
|
|
|
|
|
// not being able to be drained because of run-away log writes.
|
|
|
|
|
loggerModule.disableAllLogWrites();
|
|
|
|
|
|
|
|
|
|
// Next, get all the shutdown functions for appenders as an array.
|
|
|
|
|
var shutdownFunctions = Object.keys(appenderShutdowns).reduce(
|
|
|
|
|
function(accum, category) {
|
|
|
|
|
return accum.concat(appenders[category]);
|
|
|
|
|
return accum.concat(appenderShutdowns[category]);
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
// Call each of the shutdown functions.
|
|
|
|
|
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
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|