Home Manual Reference Source Repository

src/utils/Log.js

import logLevel from './loggers/logLevel.js';
import Logger from './loggers/Logger.js';
import ConsoleLogger from './loggers/ConsoleLogger.js';

/**
 * Provides well-formatted logging with log level filtering.
 */
class Log {
    /**
     * Create a new log.
     */
    constructor() {
        /** @type {Logger[]} */
        this.loggers = [];
        /** @type {String} */
        this._logPrefix = '';
    }

    setLogPrefix(prefix) {
        this._logPrefix = prefix;
        for (let logger of this.loggers) {
            logger.setLogPrefix(prefix);
        }
    }


    /**
     * Adds a new logger, which will process any log methods called.
     * @param {Logger}	logger - A new logger to process log requests.
     */
    addLogger(logger) {
        this.loggers.push(logger);
        logger.setLogPrefix(this._logPrefix);
    }


    /**
     * Logs a message to the console
     * @param {type}	level - Logging level
     * @param {type}	tag - Logging tag
     * @param {type}	text - Text to log
     */
    send(level, tag, text) {
        for (let logger of this.loggers) {
            logger.send(level, tag, text);
        }
    }


    /**
     * Log an object.
     * @param {type}	level - Logging level
     * @param {type}	tag - Logging tag
     * @param {type}	text - Logging text
     * @param {type}	object - Object to be logged
     */
    sendObject(level, tag, text, object) {
        for (let logger of this.loggers) {
            logger.sendObject(level, tag, text, object);
        }
    }


    /**
     * Alias for .send(Log.DEBUG, ...) / .sendObject(Log.DEBUG, ...)
     * @param {String} tag Log tag
     * @param {String} text Log message
     * @param {Object} [text] Optional object to debug
     */
    debug(tag, text, object) {
        if (object != undefined) {
            this.sendObject(logLevel.DEBUG, tag, text, object);
        } else {
            this.send(logLevel.DEBUG, tag, text);
        }
    }
    /**
     * Alias for .send(Log.INFO, ...) / .sendObject(Log.INFO, ...)
     * @param {String} tag Log tag
     * @param {String} text Log message
     * @param {Object} [text] Optional object to debug
     */
    info(tag, text, object) {
        if (object != undefined) {
            this.sendObject(logLevel.INFO, tag, text, object);
        } else {
            this.send(logLevel.INFO, tag, text);
        }
    }
    /**
     * Alias for .send(Log.WARN, ...) / .sendObject(Log.WARN, ...)
     * @param {String} tag Log tag
     * @param {String} text Log message
     * @param {Object} [text] Optional object to debug
     */
    warn(tag, text, object) {
        if (object != undefined) {
            this.sendObject(logLevel.WARN, tag, text, object);
        } else {
            this.send(logLevel.WARN, tag, text);
        }
    }
    /**
     * Alias for .send(Log.ERROR, ...) / .sendObject(Log.ERROR, ...)
     * @param {String} tag Log tag
     * @param {String} text Log message
     * @param {Object} [text] Optional object to debug
     */
    error(tag, text, object) {
        if (object != undefined) {
            this.sendObject(logLevel.ERROR, tag, text, object);
        } else {
            this.send(logLevel.ERROR, tag, text);
        }
    }
    /**
     * Alias for .send(Log.FATAL, ...) / .sendObject(Log.FATAL, ...)
     * @param {String} tag Log tag
     * @param {String} text Log message
     * @param {Object} [text] Optional object to debug
     */
    fatal(tag, text, object) {
        if (object != undefined) {
            this.sendObject(logLevel.FATAL, tag, text, object);
        } else {
            this.send(logLevel.FATAL, tag, text);
        }
    }
}


// Expose log levels on Log
/** @ignore */
var levelMap = logLevel.getMap();
for (var key in levelMap) {
    Log.prototype[levelMap[key]] = key;
}

Log.loggers = {
    Logger,
    ConsoleLogger
};

export default Log;