| 'use strict'; | 
 |  | 
 | /** | 
 |  * @fileoverview log4js is a library to log in JavaScript in similar manner | 
 |  * than in log4j for Java (but not really). | 
 |  * | 
 |  * <h3>Example:</h3> | 
 |  * <pre> | 
 |  *  const logging = require('log4js'); | 
 |  *  const log = logging.getLogger('some-category'); | 
 |  * | 
 |  *  //call the log | 
 |  *  log.trace('trace me' ); | 
 |  * </pre> | 
 |  * | 
 |  * NOTE: the authors below are the original browser-based log4js authors | 
 |  * don't try to contact them about bugs in this version :) | 
 |  * @author Stephan Strittmatter - http://jroller.com/page/stritti | 
 |  * @author Seth Chisamore - http://www.chisamore.com | 
 |  * @since 2005-05-20 | 
 |  * Website: http://log4js.berlios.de | 
 |  */ | 
 | const debug = require('debug')('log4js:main'); | 
 | const fs = require('fs'); | 
 | const deepClone = require('rfdc')({ proto: true }); | 
 | const configuration = require('./configuration'); | 
 | const layouts = require('./layouts'); | 
 | const levels = require('./levels'); | 
 | const appenders = require('./appenders'); | 
 | const categories = require('./categories'); | 
 | const Logger = require('./logger'); | 
 | const clustering = require('./clustering'); | 
 | const connectLogger = require('./connect-logger'); | 
 |  | 
 | let enabled = false; | 
 |  | 
 | function sendLogEventToAppender(logEvent) { | 
 |   if (!enabled) return; | 
 |   debug('Received log event ', logEvent); | 
 |   const categoryAppenders = categories.appendersForCategory(logEvent.categoryName); | 
 |   categoryAppenders.forEach((appender) => { | 
 |     appender(logEvent); | 
 |   }); | 
 | } | 
 |  | 
 | function loadConfigurationFile(filename) { | 
 |   if (filename) { | 
 |     debug(`Loading configuration from ${filename}`); | 
 |     return JSON.parse(fs.readFileSync(filename, 'utf8')); | 
 |   } | 
 |   return filename; | 
 | } | 
 |  | 
 | function configure(configurationFileOrObject) { | 
 |   let configObject = configurationFileOrObject; | 
 |  | 
 |   if (typeof configObject === 'string') { | 
 |     configObject = loadConfigurationFile(configurationFileOrObject); | 
 |   } | 
 |   debug(`Configuration is ${configObject}`); | 
 |  | 
 |   configuration.configure(deepClone(configObject)); | 
 |  | 
 |   clustering.onMessage(sendLogEventToAppender); | 
 |  | 
 |   enabled = true; | 
 |  | 
 |   // eslint-disable-next-line no-use-before-define | 
 |   return log4js; | 
 | } | 
 |  | 
 | /** | 
 |  * 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. | 
 |  */ | 
 | function shutdown(cb) { | 
 |   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. | 
 |   enabled = false; | 
 |  | 
 |   // Call each of the shutdown functions in parallel | 
 |   const appendersToCheck = Array.from(appenders.values()); | 
 |   const shutdownFunctions = appendersToCheck.reduceRight((accum, next) => (next.shutdown ? accum + 1 : accum), 0); | 
 |   let completed = 0; | 
 |   let error; | 
 |  | 
 |   debug(`Found ${shutdownFunctions} appenders with shutdown functions.`); | 
 |   function complete(err) { | 
 |     error = error || err; | 
 |     completed += 1; | 
 |     debug(`Appender shutdowns complete: ${completed} / ${shutdownFunctions}`); | 
 |     if (completed >= shutdownFunctions) { | 
 |       debug('All shutdown functions completed.'); | 
 |       cb(error); | 
 |     } | 
 |   } | 
 |  | 
 |   if (shutdownFunctions === 0) { | 
 |     debug('No appenders with shutdown functions found.'); | 
 |     return cb(); | 
 |   } | 
 |  | 
 |   appendersToCheck.filter(a => a.shutdown).forEach(a => a.shutdown(complete)); | 
 |  | 
 |   return null; | 
 | } | 
 |  | 
 | /** | 
 |  * Get a logger instance. | 
 |  * @static | 
 |  * @param loggerCategoryName | 
 |  * @return {Logger} instance of logger for the category | 
 |  */ | 
 | function getLogger(category) { | 
 |   if (!enabled) { | 
 |     configure(process.env.LOG4JS_CONFIG || { | 
 |       appenders: { out: { type: 'stdout' } }, | 
 |       categories: { default: { appenders: ['out'], level: 'OFF' } } | 
 |     }); | 
 |   } | 
 |   return new Logger(category || 'default'); | 
 | } | 
 |  | 
 |  | 
 | /** | 
 |  * @name log4js | 
 |  * @namespace Log4js | 
 |  * @property getLogger | 
 |  * @property configure | 
 |  * @property shutdown | 
 |  */ | 
 | const log4js = { | 
 |   getLogger, | 
 |   configure, | 
 |   shutdown, | 
 |   connectLogger, | 
 |   levels, | 
 |   addLayout: layouts.addLayout, | 
 | }; | 
 |  | 
 | module.exports = log4js; |