/** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ define([ './levels-pool' ], function (logLevels) { 'use strict'; var levels = logLevels.getLevels(); /** * @param {LogOutputHandler} outputHandler * @param {LogEntryFactory} entryFactory */ function Logger(outputHandler, entryFactory) { /** * An array of log entries. * * @protected * @type {Array} */ this.entries_ = []; /** * Current display level. * * @protected * @type {Number} */ this.displayLevel_ = levels.ERROR; /** * An array of display criteria. * * @protected * @type {Array} */ this.displayCriteria_ = []; /** * @protected * @type {LogEntryFactory} */ this.entryFactory_ = entryFactory; /** * @protected * @type {Array} */ this.outputHandlers_ = [outputHandler]; this.addDisplayCriteria(this.matchesLevel_); } /** * Swaps current display level with the provided one. * * @param {Number} level - Level's code. */ Logger.prototype.setDisplayLevel = function (level) { var levelName = logLevels.getNameByCode(level); if (!levelName) { throw new TypeError('The provided level is not defined in the levels list.'); } this.displayLevel_ = level; }; /** * Sets up the criteria by which log entries will be filtered out from the output. * * @param {LogCriteria} criteria */ Logger.prototype.addDisplayCriteria = function (criteria) { this.displayCriteria_.push(criteria); }; /** * Removes previously defined criteria. * * @param {LogCriteria} criteria */ Logger.prototype.removeDisplayCriteria = function (criteria) { var index = this.displayCriteria_.indexOf(criteria); if (~index) { this.displayCriteria_.splice(index, 1); } }; /** * @param {String} message * @param {Object} [messageData] * @returns {LogEntry} */ Logger.prototype.error = function (message, messageData) { return this.log_(message, levels.ERROR, messageData); }; /** * @param {String} message * @param {Object} [messageData] * @returns {LogEntry} */ Logger.prototype.warn = function (message, messageData) { return this.log_(message, levels.WARN, messageData); }; /** * @param {String} message * @param {Object} [messageData] * @returns {LogEntry} */ Logger.prototype.info = function (message, messageData) { return this.log_(message, levels.INFO, messageData); }; /** * @param {String} message * @param {Object} [messageData] * @returns {LogEntry} */ Logger.prototype.debug = function (message, messageData) { return this.log_(message, levels.DEBUG, messageData); }; /** * @protected * @param {String} message * @param {Number} level * @param {Object} [messageData] * @returns {LogEntry} */ Logger.prototype.log_ = function (message, level, messageData) { var entry = this.createEntry_(message, level, messageData); this.entries_.push(entry); if (this.matchesCriteria_(entry)) { this.processOutput_(entry); } return entry; }; /** * @protected * @param {String} message * @param {Number} level * @param {Object} [messageData] * @returns {LogEntry} */ Logger.prototype.createEntry_ = function (message, level, messageData) { return this.entryFactory_.createEntry(message, level, messageData); }; /** * Returns an array of log entries that have been added to the logger. * * @param {LogCriteria} [criteria] - Optional filter criteria. * @returns {Array} */ Logger.prototype.getEntries = function (criteria) { if (criteria) { return this.entries_.filter(criteria); } return this.entries_; }; /** * @param {LogCriteria} [criteria] */ Logger.prototype.dump = function (criteria) { var entries; if (!criteria) { criteria = this.matchesCriteria_; } entries = this.entries_.filter(criteria, this); this.outputHandlers_.forEach(function (handler) { handler.dump(entries); }); }; /** * @protected * @param {LogEntry} entry */ Logger.prototype.processOutput_ = function (entry) { this.outputHandlers_.forEach(function (handler) { handler.show(entry); }); }; /** * @protected * @param {LogEntry} entry * @returns {Boolean} */ Logger.prototype.matchesCriteria_ = function (entry) { return this.displayCriteria_.every(function (criteria) { return criteria.call(this, entry); }, this); }; /** * Checks that the level of provided entry passes the "displayLevel_" threshold. * * @protected * @param {LogEntry} entry - Entry to be checked. * @returns {Boolean} */ Logger.prototype.matchesLevel_ = function (entry) { return entry.level <= this.displayLevel_; }; return Logger; });