diff options
Diffstat (limited to 'public/js/icinga/logger.js')
-rw-r--r-- | public/js/icinga/logger.js | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/public/js/icinga/logger.js b/public/js/icinga/logger.js new file mode 100644 index 0000000..471393c --- /dev/null +++ b/public/js/icinga/logger.js @@ -0,0 +1,129 @@ +/*! Icinga Web 2 | (c) 2014 Icinga Development Team | GPLv2+ */ + +/** + * Icinga.Logger + * + * Well, log output. Rocket science. + */ +(function (Icinga) { + + 'use strict'; + + Icinga.Logger = function (icinga) { + + this.icinga = icinga; + + this.logLevel = 'info'; + + this.logLevels = { + 'debug': 0, + 'info' : 1, + 'warn' : 2, + 'error': 3 + }; + + }; + + Icinga.Logger.prototype = { + + /** + * Whether the browser has a console object + */ + hasConsole: function () { + return 'undefined' !== typeof console; + }, + + /** + * Raise or lower current log level + * + * Messages below this threshold will be silently discarded + */ + setLevel: function (level) { + if ('undefined' !== typeof this.numericLevel(level)) { + this.logLevel = level; + } + return this; + }, + + /** + * Log a debug message + */ + debug: function () { + return this.writeToConsole('debug', arguments); + }, + + /** + * Log an informational message + */ + info: function () { + return this.writeToConsole('info', arguments); + }, + + /** + * Log a warning message + */ + warn: function () { + return this.writeToConsole('warn', arguments); + }, + + /** + * Log an error message + */ + error: function () { + return this.writeToConsole('error', arguments); + }, + + /** + * Write a log message with the given level to the console + */ + writeToConsole: function (level, args) { + + args = Array.prototype.slice.call(args); + + // We want our log messages to carry precise timestamps + args.unshift(this.icinga.utils.timeWithMs()); + + if (this.hasConsole() && this.hasLogLevel(level)) { + if (typeof console[level] !== 'undefined') { + if (typeof console[level].apply === 'function') { + console[level].apply(console, args); + } else { + args.unshift('[' + level + ']'); + console[level](args.join(' ')); + } + } else if ('undefined' !== typeof console.log) { + args.unshift('[' + level + ']'); + console.log(args.join(' ')); + } + } + return this; + }, + + /** + * Return the numeric identifier for a given log level + */ + numericLevel: function (level) { + var ret = this.logLevels[level]; + if ('undefined' === typeof ret) { + throw 'Got invalid log level ' + level; + } + return ret; + }, + + /** + * Whether a given log level exists + */ + hasLogLevel: function (level) { + return this.numericLevel(level) >= this.numericLevel(this.logLevel); + }, + + /** + * There isn't much to clean up here + */ + destroy: function () { + this.enabled = false; + this.icinga = null; + } + }; + +}(Icinga)); |