185 lines
4.2 KiB
JavaScript

/**
* @class Logger
*
* @author: darryl.west@raincitysoftware.com
* @created: 7/5/14 6:28 PM
*/
const Logger = function(options) {
'use strict';
const logger = this,
pid = options.pid || process.pid,
errorEventName = options.errorEventName,
stats = new Map();
let domain = options.domain,
category = options.category,
level = options.level || Logger.DEFAULT_LEVEL,
levels = options.levels || Logger.STANDARD_LEVELS,
currentLevel = levels.indexOf( level ),
appenders = options.appenders || [];
// helper method
const isLevelAt = function(lvl) {
const idx = levels.indexOf( lvl );
return idx >= currentLevel;
};
/**
* log the statement message
*
* @param level the level of this message (label, i.e, info, warn, etc)
* @param msg
*/
this.log = function(level, msg) {
const entry = logger.createEntry( level, msg );
process.nextTick(function() {
// write the message to the appenders...
appenders.forEach(function(appender) {
appender.write( entry );
});
if (level === 'error' && typeof(errorEventName) === 'string') {
process.emit(errorEventName, entry);
}
});
return entry;
};
/**
* create the entry object used to log messages
*
* @param level - info, debug, etc.
* @param messageList - a list of message objects
* @returns then entry object
*/
this.createEntry = function(level, messageList) {
const entry = {};
entry.ts = Date.now();
entry.pid = pid;
if (domain) {
entry.domain = domain;
}
if (category) {
entry.category = category;
}
entry.level = level;
entry.msg = messageList;
return entry;
};
/**
* set the level
*
* @param lvl one of the recognized logger levels
*/
this.setLevel = function(lvl) {
currentLevel = levels.indexOf(lvl);
level = lvl;
appenders.forEach(app => {
app.setLevel( lvl );
});
};
/**
* return the current level string
*/
this.getLevel = function() {
return level;
};
/**
* set the list of appenders
* @param app
*/
this.setAppenders = function(appenderList) {
appenders = appenderList;
};
/**
* add an appender to the list
*
* @param appender - implements write method
*/
this.addAppender = function(appender) {
appenders.push( appender );
};
/**
* remove the appender using the type name
*/
this.removeAppender = function(typeName) {
throw new Error(`remove appender ${typeName} is not implemented yet...`);
};
this.getAppenders = function() {
return appenders;
};
this.isDebug = function() {
return isLevelAt( 'debug' );
};
this.isInfo = function() {
return isLevelAt( 'info' );
};
/**
* return the status map with log counts for each level
*/
this.getStats = function() {
return stats;
};
/**
* return the category name
*/
this.getCategory = function() {
return category;
};
/**
* return the domain name
*/
this.getDomain = function() {
return domain;
};
// now initialize the methods for the standard levels
const init = function() {
levels.forEach(function(lvl) {
stats.set(lvl, 0);
logger[ lvl ] = function() {
stats.set(lvl, stats.get(lvl) + 1);
if (levels.indexOf( lvl ) >= currentLevel) {
const args = Array.prototype.slice.call( arguments );
logger.log( lvl, args );
}
};
});
};
this.__protected = function() {
return {
pid:pid,
domain:domain,
category:category
};
};
init();
};
Logger.STANDARD_LEVELS = [ 'all', 'trace', 'debug', 'info', 'warn', 'error', 'fatal' ];
Logger.DEFAULT_LEVEL = 'info';
module.exports = Logger;