"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Logger = exports.LoggerLevel = void 0;
const util_1 = require("util");
const error_1 = require("./error");
const utils_1 = require("./utils");
// Filters for classes
const classFilters = {};
let filteredClasses = {};
let level;
// Save the process id
const pid = process.pid;
// current logger
// eslint-disable-next-line no-console
let currentLogger = console.warn;
/** @public */
exports.LoggerLevel = Object.freeze({
ERROR: 'error',
WARN: 'warn',
INFO: 'info',
DEBUG: 'debug',
error: 'error',
warn: 'warn',
info: 'info',
debug: 'debug'
});
/**
* @public
*/
class Logger {
/**
* Creates a new Logger instance
*
* @param className - The Class name associated with the logging instance
* @param options - Optional logging settings
*/
constructor(className, options) {
options = options !== null && options !== void 0 ? options : {};
// Current reference
this.className = className;
// Current logger
if (!(options.logger instanceof Logger) && typeof options.logger === 'function') {
currentLogger = options.logger;
}
// Set level of logging, default is error
if (options.loggerLevel) {
level = options.loggerLevel || exports.LoggerLevel.ERROR;
}
// Add all class names
if (filteredClasses[this.className] == null) {
classFilters[this.className] = true;
}
}
/**
* Log a message at the debug level
*
* @param message - The message to log
* @param object - Additional meta data to log
*/
debug(message, object) {
if (this.isDebug() &&
((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className]) ||
(Object.keys(filteredClasses).length === 0 && classFilters[this.className]))) {
const dateTime = new Date().getTime();
const msg = (0, util_1.format)('[%s-%s:%s] %s %s', 'DEBUG', this.className, pid, dateTime, message);
const state = {
type: exports.LoggerLevel.DEBUG,
message,
className: this.className,
pid,
date: dateTime
};
if (object)
state.meta = object;
currentLogger(msg, state);
}
}
/**
* Log a message at the warn level
*
* @param message - The message to log
* @param object - Additional meta data to log
*/
warn(message, object) {
if (this.isWarn() &&
((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className]) ||
(Object.keys(filteredClasses).length === 0 && classFilters[this.className]))) {
const dateTime = new Date().getTime();
const msg = (0, util_1.format)('[%s-%s:%s] %s %s', 'WARN', this.className, pid, dateTime, message);
const state = {
type: exports.LoggerLevel.WARN,
message,
className: this.className,
pid,
date: dateTime
};
if (object)
state.meta = object;
currentLogger(msg, state);
}
}
/**
* Log a message at the info level
*
* @param message - The message to log
* @param object - Additional meta data to log
*/
info(message, object) {
if (this.isInfo() &&
((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className]) ||
(Object.keys(filteredClasses).length === 0 && classFilters[this.className]))) {
const dateTime = new Date().getTime();
const msg = (0, util_1.format)('[%s-%s:%s] %s %s', 'INFO', this.className, pid, dateTime, message);
const state = {
type: exports.LoggerLevel.INFO,
message,
className: this.className,
pid,
date: dateTime
};
if (object)
state.meta = object;
currentLogger(msg, state);
}
}
/**
* Log a message at the error level
*
* @param message - The message to log
* @param object - Additional meta data to log
*/
error(message, object) {
if (this.isError() &&
((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className]) ||
(Object.keys(filteredClasses).length === 0 && classFilters[this.className]))) {
const dateTime = new Date().getTime();
const msg = (0, util_1.format)('[%s-%s:%s] %s %s', 'ERROR', this.className, pid, dateTime, message);
const state = {
type: exports.LoggerLevel.ERROR,
message,
className: this.className,
pid,
date: dateTime
};
if (object)
state.meta = object;
currentLogger(msg, state);
}
}
/** Is the logger set at info level */
isInfo() {
return level === exports.LoggerLevel.INFO || level === exports.LoggerLevel.DEBUG;
}
/** Is the logger set at error level */
isError() {
return level === exports.LoggerLevel.ERROR || level === exports.LoggerLevel.INFO || level === exports.LoggerLevel.DEBUG;
}
/** Is the logger set at error level */
isWarn() {
return (level === exports.LoggerLevel.ERROR ||
level === exports.LoggerLevel.WARN ||
level === exports.LoggerLevel.INFO ||
level === exports.LoggerLevel.DEBUG);
}
/** Is the logger set at debug level */
isDebug() {
return level === exports.LoggerLevel.DEBUG;
}
/** Resets the logger to default settings, error and no filtered classes */
static reset() {
level = exports.LoggerLevel.ERROR;
filteredClasses = {};
}
/** Get the current logger function */
static currentLogger() {
return currentLogger;
}
/**
* Set the current logger function
*
* @param logger - Custom logging function
*/
static setCurrentLogger(logger) {
if (typeof logger !== 'function') {
throw new error_1.MongoInvalidArgumentError('Current logger must be a function');
}
currentLogger = logger;
}
/**
* Filter log messages for a particular class
*
* @param type - The type of filter (currently only class)
* @param values - The filters to apply
*/
static filter(type, values) {
if (type === 'class' && Array.isArray(values)) {
filteredClasses = {};
values.forEach(x => (filteredClasses[x] = true));
}
}
/**
* Set the current log level
*
* @param newLevel - Set current log level (debug, warn, info, error)
*/
static setLevel(newLevel) {
if (newLevel !== exports.LoggerLevel.INFO &&
newLevel !== exports.LoggerLevel.ERROR &&
newLevel !== exports.LoggerLevel.DEBUG &&
newLevel !== exports.LoggerLevel.WARN) {
throw new error_1.MongoInvalidArgumentError(`Argument "newLevel" should be one of ${(0, utils_1.enumToString)(exports.LoggerLevel)}`);
}
level = newLevel;
}
}
exports.Logger = Logger;
//# sourceMappingURL=logger.js.map