diff --git a/lib/log4js.js b/lib/log4js.js index 7eca310..dfe2395 100644 --- a/lib/log4js.js +++ b/lib/log4js.js @@ -1,4 +1,5 @@ -"use strict"; +/* eslint no-prototype-builtins:1,no-restricted-syntax:[1, "ForInStatement"] */ +'use strict'; /* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,19 +20,19 @@ * *

Example:

*
- *  var logging = require('log4js');
+ *  let logging = require('log4js');
  *  //add an appender that logs all messages to stdout.
  *  logging.addAppender(logging.consoleAppender());
- *  //add an appender that logs "some-category" to a file
- *  logging.addAppender(logging.fileAppender("file.log"), "some-category");
+ *  //add an appender that logs 'some-category' to a file
+ *  logging.addAppender(logging.fileAppender('file.log'), 'some-category');
  *  //get a logger
- *  var log = logging.getLogger("some-category");
+ *  let log = logging.getLogger('some-category');
  *  log.setLevel(logging.levels.TRACE); //set the Level
  *
  *  ...
  *
  *  //call the log
- *  log.trace("trace me" );
+ *  log.trace('trace me' );
  * 
* * NOTE: the authors below are the original browser-based log4js authors @@ -43,23 +44,20 @@ * @static * Website: http://log4js.berlios.de */ -var events = require('events') - , fs = require('fs') - , path = require('path') - , util = require('util') - , layouts = require('./layouts') - , levels = require('./levels') - , loggerModule = require('./logger') - , LoggingEvent = loggerModule.LoggingEvent - , Logger = loggerModule.Logger - , ALL_CATEGORIES = '[all]' - , appenders = {} - , loggers = {} - , appenderMakers = {} - , appenderShutdowns = {} - , defaultConfig = { +const fs = require('fs'); +const util = require('util'); +const layouts = require('./layouts'); +const levels = require('./levels'); +const loggerModule = require('./logger'); +const Logger = loggerModule.Logger; +const ALL_CATEGORIES = '[all]'; +let appenders = {}; +const loggers = {}; +const appenderMakers = {}; +const appenderShutdowns = {}; +const defaultConfig = { appenders: [ - { type: "console" } + { type: 'console' } ], replaceConsole: false }; @@ -71,32 +69,23 @@ function hasLogger(logger) { } levels.forName = function (levelStr, levelVal) { - var level; - if (typeof levelStr === "string" && typeof levelVal === "number") { - var levelUpper = levelStr.toUpperCase(); + let level; + if (typeof levelStr === 'string' && typeof levelVal === 'number') { + const levelUpper = levelStr.toUpperCase(); level = new levels.Level(levelVal, levelUpper); loggerModule.addLevelMethods(level); } return level; }; -levels.getLevel = function (levelStr) { - var level; - if (typeof levelStr === "string") { - var levelUpper = levelStr.toUpperCase(); - level = levels.toLevel(levelStr); - } - return level; -}; - function getBufferedLogger(categoryName) { - var base_logger = getLogger(categoryName); - var logger = {}; + const baseLogger = getLogger(categoryName); + const logger = {}; logger.temp = []; - logger.target = base_logger; + logger.target = baseLogger; logger.flush = function () { - for (var i = 0; i < logger.temp.length; i++) { - var log = logger.temp[i]; + for (let i = 0; i < logger.temp.length; i++) { + const log = logger.temp[i]; logger.target[log.level](log.message); delete logger.temp[i]; } @@ -112,49 +101,45 @@ function getBufferedLogger(categoryName) { } function normalizeCategory(category) { - return category + '.'; + return `${category}.`; } function doesLevelEntryContainsLogger(levelCategory, loggerCategory) { - var normalizedLevelCategory = normalizeCategory(levelCategory); - var normalizedLoggerCategory = normalizeCategory(loggerCategory); - return normalizedLoggerCategory.substring(0, normalizedLevelCategory.length) == normalizedLevelCategory; //jshint - // ignore:line + const normalizedLevelCategory = normalizeCategory(levelCategory); + const normalizedLoggerCategory = normalizeCategory(loggerCategory); + return normalizedLoggerCategory.substring(0, normalizedLevelCategory.length) === normalizedLevelCategory; } function doesAppenderContainsLogger(appenderCategory, loggerCategory) { - var normalizedAppenderCategory = normalizeCategory(appenderCategory); - var normalizedLoggerCategory = normalizeCategory(loggerCategory); - return normalizedLoggerCategory.substring(0, normalizedAppenderCategory.length) == normalizedAppenderCategory; //jshint - // ignore:line + const normalizedAppenderCategory = normalizeCategory(appenderCategory); + const normalizedLoggerCategory = normalizeCategory(loggerCategory); + return normalizedLoggerCategory.substring(0, normalizedAppenderCategory.length) === normalizedAppenderCategory; } /** * Get a logger instance. Instance is cached on categoryName level. - * @param {String} categoryName name of category to log to. - * @return {Logger} instance of logger for the category * @static + * @param loggerCategoryName + * @return {Logger} instance of logger for the category */ function getLogger(loggerCategoryName) { - // Use default logger if categoryName is not specified or invalid - if (typeof loggerCategoryName !== "string") { + if (typeof loggerCategoryName !== 'string') { loggerCategoryName = Logger.DEFAULT_CATEGORY; } if (!hasLogger(loggerCategoryName)) { - - var level; + let level; /* jshint -W073 */ - // If there's a "levels" entry in the configuration + // If there's a 'levels' entry in the configuration if (levels.config) { // Goes through the categories in the levels configuration entry, - // starting with the "higher" ones. - var keys = Object.keys(levels.config).sort(); - for (var idx = 0; idx < keys.length; idx++) { - var levelCategory = keys[idx]; + // starting with the 'higher' ones. + const keys = Object.keys(levels.config).sort(); + for (let idx = 0; idx < keys.length; idx++) { + const levelCategory = keys[idx]; if (doesLevelEntryContainsLogger(levelCategory, loggerCategoryName)) { // level for the logger level = levels.config[levelCategory]; @@ -167,22 +152,18 @@ function getLogger(loggerCategoryName) { loggers[loggerCategoryName] = new Logger(loggerCategoryName, level); /* jshint -W083 */ - var appenderList; - for (var appenderCategory in appenders) { + let appenderList; + for (const appenderCategory in appenders) { if (doesAppenderContainsLogger(appenderCategory, loggerCategoryName)) { appenderList = appenders[appenderCategory]; - appenderList.forEach(function (appender) { - loggers[loggerCategoryName].addListener("log", appender); - }); + appenderList.forEach(appender => { loggers[loggerCategoryName].addListener('log', appender); }); } } /* jshint +W083 */ if (appenders[ALL_CATEGORIES]) { appenderList = appenders[ALL_CATEGORIES]; - appenderList.forEach(function (appender) { - loggers[loggerCategoryName].addListener("log", appender); - }); + appenderList.forEach(appender => { loggers[loggerCategoryName].addListener('log', appender); }); } } @@ -192,38 +173,35 @@ function getLogger(loggerCategoryName) { /** * args are appender, then zero or more categories */ -function addAppender() { - var args = Array.prototype.slice.call(arguments); - var appender = args.shift(); +function addAppender(...args) { + const appender = args.shift(); if (args.length === 0 || args[0] === undefined) { args = [ALL_CATEGORIES]; } - //argument may already be an array + // argument may already be an array if (Array.isArray(args[0])) { args = args[0]; } - args.forEach(function (appenderCategory) { + args.forEach(appenderCategory => { addAppenderToCategory(appender, appenderCategory); if (appenderCategory === ALL_CATEGORIES) { addAppenderToAllLoggers(appender); } else { - - for (var loggerCategory in loggers) { + for (const loggerCategory in loggers) { if (doesAppenderContainsLogger(appenderCategory, loggerCategory)) { - loggers[loggerCategory].addListener("log", appender); + loggers[loggerCategory].addListener('log', appender); } } - } }); } function addAppenderToAllLoggers(appender) { - for (var logger in loggers) { + for (const logger in loggers) { if (hasLogger(logger)) { - loggers[logger].addListener("log", appender); + loggers[logger].addListener('log', appender); } } } @@ -237,9 +215,9 @@ function addAppenderToCategory(appender, category) { function clearAppenders() { appenders = {}; - for (var logger in loggers) { + for (const logger in loggers) { if (hasLogger(logger)) { - loggers[logger].removeAllListeners("log"); + loggers[logger].removeAllListeners('log'); } } } @@ -247,15 +225,15 @@ function clearAppenders() { function configureAppenders(appenderList, options) { clearAppenders(); if (appenderList) { - appenderList.forEach(function (appenderConfig) { + appenderList.forEach(appenderConfig => { loadAppender(appenderConfig.type); - var appender; + let appender; appenderConfig.makers = appenderMakers; try { appender = appenderMakers[appenderConfig.type](appenderConfig, options); addAppender(appender, appenderConfig.category); } catch (e) { - throw new Error("log4js configuration problem for " + util.inspect(appenderConfig), e); + throw new Error(`log4js configuration problem for ${util.inspect(appenderConfig)}`, e); } }); } @@ -264,19 +242,20 @@ function configureAppenders(appenderList, options) { function configureLevels(_levels) { levels.config = _levels; // Keep it so we can create loggers later using this cfg if (_levels) { - var keys = Object.keys(levels.config).sort(); - for (var idx in keys) { - var category = keys[idx]; + const keys = Object.keys(levels.config).sort(); + + /* eslint-disable guard-for-in */ + for (const idx in keys) { + const category = keys[idx]; if (category === ALL_CATEGORIES) { setGlobalLogLevel(_levels[category]); } - /* jshint -W073 */ - for (var loggerCategory in loggers) { + + for (const loggerCategory in loggers) { if (doesLevelEntryContainsLogger(category, loggerCategory)) { loggers[loggerCategory].setLevel(_levels[category]); } } - /* jshint +W073 */ } } } @@ -294,11 +273,11 @@ function getDefaultLogger() { return getLogger(Logger.DEFAULT_CATEGORY); } -var configState = {}; +const configState = {}; function loadConfigurationFile(filename) { if (filename) { - return JSON.parse(fs.readFileSync(filename, "utf8")); + return JSON.parse(fs.readFileSync(filename, 'utf8')); } return undefined; } @@ -316,15 +295,14 @@ function configureOnceOff(config, options) { } } catch (e) { throw new Error( - "Problem reading log4js config " + util.inspect(config) + - ". Error was \"" + e.message + "\" (" + e.stack + ")" + `Problem reading log4js config ${util.inspect(config)}. Error was '${e.message}' (${e.stack})` ); } } } function reloadConfiguration(options) { - var mtime = getMTime(configState.filename); + const mtime = getMTime(configState.filename); if (!mtime) return; if (configState.lastMTime && (mtime.getTime() > configState.lastMTime.getTime())) { @@ -334,11 +312,11 @@ function reloadConfiguration(options) { } function getMTime(filename) { - var mtime; + let mtime; try { mtime = fs.statSync(configState.filename).mtime; } catch (e) { - getLogger('log4js').warn('Failed to load configuration file ' + filename); + getLogger('log4js').warn(`Failed to load configuration file ${filename}`); } return mtime; } @@ -354,7 +332,7 @@ function initReloadConfiguration(filename, options) { } function configure(configurationFileOrObject, options) { - var config = configurationFileOrObject; + let config = configurationFileOrObject; config = config || process.env.LOG4JS_CONFIG; options = options || {}; @@ -373,7 +351,7 @@ function configure(configurationFileOrObject, options) { configureOnceOff(config, options); } -var originalConsoleFunctions = { +const originalConsoleFunctions = { log: console.log, debug: console.debug, info: console.info, @@ -383,26 +361,26 @@ var originalConsoleFunctions = { function replaceConsole(logger) { function replaceWith(fn) { - return function () { - fn.apply(logger, arguments); + return function (...args) { + fn.apply(logger, args); }; } - logger = logger || getLogger("console"); - ['log', 'debug', 'info', 'warn', 'error'].forEach(function (item) { + logger = logger || getLogger('console'); + + ['log', 'debug', 'info', 'warn', 'error'].forEach(item => { console[item] = replaceWith(item === 'log' ? logger.info : logger[item]); }); } function restoreConsole() { - ['log', 'debug', 'info', 'warn', 'error'].forEach(function (item) { - console[item] = originalConsoleFunctions[item]; - }); + ['log', 'debug', 'info', 'warn', 'error'].forEach(item => { console[item] = originalConsoleFunctions[item]; }); } +/* eslint global-require:0 */ /** * Load an appenderModule based on the provided appender filepath. Will first - * check if the appender path is a subpath of the log4js "lib/appenders" directory. + * check if the appender path is a subpath of the log4js 'lib/appenders' directory. * If not, it will attempt to load the the appender as complete path. * * @param {string} appender The filepath for the appender. @@ -410,9 +388,9 @@ function restoreConsole() { * @private */ function requireAppender(appender) { - var appenderModule; + let appenderModule; try { - appenderModule = require('./appenders/' + appender); + appenderModule = require(`./appenders/${appender}`); } catch (e) { appenderModule = require(appender); } @@ -433,7 +411,7 @@ function loadAppender(appender, appenderModule) { appenderModule = appenderModule || requireAppender(appender); if (!appenderModule) { - throw new Error("Invalid log4js appender: " + util.inspect(appender)); + throw new Error(`Invalid log4js appender: ${util.inspect(appender)}`); } module.exports.appenders[appender] = appenderModule.appender.bind(appenderModule); @@ -450,7 +428,6 @@ function loadAppender(appender, appenderModule) { * @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) { // First, disable all writing to appenders. This prevents appenders from @@ -458,27 +435,37 @@ function shutdown(cb) { loggerModule.disableAllLogWrites(); // Call each of the shutdown functions in parallel - var completed = 0; - var error; - var shutdownFcts = []; - var complete = function (err) { + let completed = 0; + let error; + const shutdownFunctions = []; + + function complete(err) { error = error || err; completed++; - if (completed >= shutdownFcts.length) { + if (completed >= shutdownFunctions.length) { cb(error); } - }; - for (var category in appenderShutdowns) { + } + + for (const category in appenderShutdowns) { if (appenderShutdowns.hasOwnProperty(category)) { - shutdownFcts.push(appenderShutdowns[category]); + shutdownFunctions.push(appenderShutdowns[category]); } } - if (!shutdownFcts.length) { + + if (!shutdownFunctions.length) { return cb(); } - shutdownFcts.forEach(function (shutdownFct) { shutdownFct(complete); }); + + shutdownFunctions.forEach(shutdownFct => { shutdownFct(complete); }); + + return null; } +/** + * + * @name Log4js + */ module.exports = { getBufferedLogger: getBufferedLogger, getLogger: getLogger, @@ -503,5 +490,5 @@ module.exports = { connectLogger: require('./connect-logger').connectLogger }; -//set ourselves up +// set ourselves up configure();