| '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; |