import { LogLevel } from './LogLevel.js'; import { Request } from '../Message/Request/Request.js'; /** * Logger class. * * @copyright Dennis Eichhorn * @license OMS License 1.0 * @version 1.0.0 * @since 1.0.0 */ export class Logger { /** * @constructor * * @param {boolean} verbose Verbose logging * @param {boolean} ui Ui logging * @param {boolean} remote Remote logging * * @since 1.0.0 */ constructor (verbose = true, ui = true, remote = false) { this.verbose = verbose; this.ui = ui; this.remote = remote; }; /** * Get logging instance * * @param {boolean} [verbose] Verbose logging * @param {boolean} [ui] Ui logging * @param {boolean} [remote] Remote logging * * @return {Object} * * @since 1.0.0 */ static getInstance (verbose = true, ui = true, remote = false) { if(!Logger.instance) { Logger.instance = new Logger(verbose, ui, remote); } return Logger.instance; }; /** * Interpolate message * * @param {string} message Message structure * @param {Object} [context] Context to put into message * @param {string} [level] Log level * * @return {string} * * @since 1.0.0 */ interpolate (message, context, level) { message = typeof message === 'undefined' ? Logger.MSG_FULL : message; for (let replace in context) { if (context.hasOwnProperty(replace) && typeof message === 'string') { message = message.replace('{' + replace + '}', context[replace]); } } return (typeof message) !== 'string' ? JSON.stringify(message) : message; }; /** * Create context * * @param {string} message Message to display * @param {Object} [context] Context to put into message * @param {string} level Log level * * @return {Object} * * @since 1.0.0 */ createContext (message, context, level) { context.datetime = (new Date()).toISOString(); context.version = '1.0.0'; context.os = Request.getOS(); context.browser = Request.getBrowser(); context.path = window.location.href; context.level = level; context.message = message; return context; }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * @param {string} level Log level * * @return {void} * * @since 1.0.0 */ write (message, context, level) { context = this.createContext(message, context, level); if (this.verbose) { this.writeVerbose(message, context, level); } if (this.ui) { // todo: fill log box, set class and initiate animation } if (this.remote) { this.writeRemote(message, context, level); } }; /** * Create local log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * @param {string} level Log level * * @return {void} * * @since 1.0.0 */ writeVerbose (message, context, level) { let color = '000'; switch (level) { case 'info': case 'notice': case 'log': color = '000'; break; case 'debug': color = '289E39'; break; case 'warning': case 'alert': color = 'FFA600'; break; case 'error': case 'critical': case 'emergency': color = 'CF304A'; break; default: } console.log('%c' + this.interpolate(message, context, level), 'color: #' + color); }; /** * Create remote log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * @param {string} level Log level * * @return {void} * * @since 1.0.0 */ writeRemote (message, context, level) { let request = new Request(); request.setData(context); request.setType(jsOMS.Message.Response.Response.ResponseType.JSON); request.setUri('/{/lang}/api/log'); request.setMethod(Request.RequestMethod.POST); request.setRequestHeader('Content-Type', 'application/json'); request.setSuccess(function (xhr) { }); request.send(); }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ emergency (message, context = {}) { this.write(message, context, LogLevel.EMERGENCY); }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ alert (message, context = {}) { this.write(message, context, LogLevel.ALERT); }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ critical (message, context = {}) { this.write(message, context, LogLevel.CRITICAL); }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ error (message, context = {}) { this.write(message, context, LogLevel.ERROR); }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ warning (message, context = {}) { this.write(message, context, LogLevel.WARNING); }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ notice (message, context = {}) { this.write(message, context, LogLevel.NOTICE); }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ info (message, context = {}) { this.write(message, context, LogLevel.INFO); }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ debug (message, context = {}) { this.write(message, context, LogLevel.DEBUG); }; /** * Create log message * * @param {string} level Log level * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ log (level, message, context = {}) { this.write(message, context, level); }; /** * Create log message * * @param {string} message Message to display * @param {Object} [context] Context to put into message * * @return {void} * * @since 1.0.0 */ console (message, context = {}) { this.writeVerbose(message, context, LogLevel.INFO); }; } Logger.instance = null; Logger.MSG_FULL = '{datetime}; {level}; {version}; {os}; {browser}; {path}; {message}';