185 lines
4.2 KiB
JavaScript
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;
|