mirror of
https://github.com/log4js-node/log4js-node.git
synced 2025-12-08 19:26:01 +00:00
refactor: log4js.js
remove levels.getLevel function as it have move to the levels.js
This commit is contained in:
parent
8f6d69ba01
commit
87797195f9
229
lib/log4js.js
229
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 @@
|
||||
*
|
||||
* <h3>Example:</h3>
|
||||
* <pre>
|
||||
* 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' );
|
||||
* </pre>
|
||||
*
|
||||
* 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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user