Source: node_modules/mongodb-core/lib/connection/logger.js

  1. "use strict";
  2. var f = require('util').format
  3. , MongoError = require('../error');
  4. // Filters for classes
  5. var classFilters = {};
  6. var filteredClasses = {};
  7. var level = null;
  8. // Save the process id
  9. var pid = process.pid;
  10. // current logger
  11. var currentLogger = null;
  12. /**
  13. * Creates a new Logger instance
  14. * @class
  15. * @param {string} className The Class name associated with the logging instance
  16. * @param {object} [options=null] Optional settings.
  17. * @param {Function} [options.logger=null] Custom logger function;
  18. * @param {string} [options.loggerLevel=error] Override default global log level.
  19. * @return {Logger} a Logger instance.
  20. */
  21. var Logger = function(className, options) {
  22. if(!(this instanceof Logger)) return new Logger(className, options);
  23. options = options || {};
  24. // Current reference
  25. this.className = className;
  26. // Current logger
  27. if(options.logger) {
  28. currentLogger = options.logger;
  29. } else if(currentLogger == null) {
  30. currentLogger = console.log;
  31. }
  32. // Set level of logging, default is error
  33. if(options.loggerLevel) {
  34. level = options.loggerLevel || 'error';
  35. }
  36. // Add all class names
  37. if(filteredClasses[this.className] == null) classFilters[this.className] = true;
  38. }
  39. /**
  40. * Log a message at the debug level
  41. * @method
  42. * @param {string} message The message to log
  43. * @param {object} object additional meta data to log
  44. * @return {null}
  45. */
  46. Logger.prototype.debug = function(message, object) {
  47. if(this.isDebug()
  48. && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
  49. || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
  50. var dateTime = new Date().getTime();
  51. var msg = f("[%s-%s:%s] %s %s", 'DEBUG', this.className, pid, dateTime, message);
  52. var state = {
  53. type: 'debug', message: message, className: this.className, pid: pid, date: dateTime
  54. };
  55. if(object) state.meta = object;
  56. currentLogger(msg, state);
  57. }
  58. }
  59. /**
  60. * Log a message at the warn level
  61. * @method
  62. * @param {string} message The message to log
  63. * @param {object} object additional meta data to log
  64. * @return {null}
  65. */
  66. Logger.prototype.warn = function(message, object) {
  67. if(this.isWarn()
  68. && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
  69. || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
  70. var dateTime = new Date().getTime();
  71. var msg = f("[%s-%s:%s] %s %s", 'WARN', this.className, pid, dateTime, message);
  72. var state = {
  73. type: 'warn', message: message, className: this.className, pid: pid, date: dateTime
  74. };
  75. if(object) state.meta = object;
  76. currentLogger(msg, state);
  77. }
  78. },
  79. /**
  80. * Log a message at the info level
  81. * @method
  82. * @param {string} message The message to log
  83. * @param {object} object additional meta data to log
  84. * @return {null}
  85. */
  86. Logger.prototype.info = function(message, object) {
  87. if(this.isInfo()
  88. && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
  89. || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
  90. var dateTime = new Date().getTime();
  91. var msg = f("[%s-%s:%s] %s %s", 'INFO', this.className, pid, dateTime, message);
  92. var state = {
  93. type: 'info', message: message, className: this.className, pid: pid, date: dateTime
  94. };
  95. if(object) state.meta = object;
  96. currentLogger(msg, state);
  97. }
  98. },
  99. /**
  100. * Log a message at the error level
  101. * @method
  102. * @param {string} message The message to log
  103. * @param {object} object additional meta data to log
  104. * @return {null}
  105. */
  106. Logger.prototype.error = function(message, object) {
  107. if(this.isError()
  108. && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
  109. || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
  110. var dateTime = new Date().getTime();
  111. var msg = f("[%s-%s:%s] %s %s", 'ERROR', this.className, pid, dateTime, message);
  112. var state = {
  113. type: 'error', message: message, className: this.className, pid: pid, date: dateTime
  114. };
  115. if(object) state.meta = object;
  116. currentLogger(msg, state);
  117. }
  118. },
  119. /**
  120. * Is the logger set at info level
  121. * @method
  122. * @return {boolean}
  123. */
  124. Logger.prototype.isInfo = function() {
  125. return level == 'info' || level == 'debug';
  126. },
  127. /**
  128. * Is the logger set at error level
  129. * @method
  130. * @return {boolean}
  131. */
  132. Logger.prototype.isError = function() {
  133. return level == 'error' || level == 'info' || level == 'debug';
  134. },
  135. /**
  136. * Is the logger set at error level
  137. * @method
  138. * @return {boolean}
  139. */
  140. Logger.prototype.isWarn = function() {
  141. return level == 'error' || level == 'warn' || level == 'info' || level == 'debug';
  142. },
  143. /**
  144. * Is the logger set at debug level
  145. * @method
  146. * @return {boolean}
  147. */
  148. Logger.prototype.isDebug = function() {
  149. return level == 'debug';
  150. }
  151. /**
  152. * Resets the logger to default settings, error and no filtered classes
  153. * @method
  154. * @return {null}
  155. */
  156. Logger.reset = function() {
  157. level = 'error';
  158. filteredClasses = {};
  159. }
  160. /**
  161. * Get the current logger function
  162. * @method
  163. * @return {function}
  164. */
  165. Logger.currentLogger = function() {
  166. return currentLogger;
  167. }
  168. /**
  169. * Set the current logger function
  170. * @method
  171. * @param {function} logger Logger function.
  172. * @return {null}
  173. */
  174. Logger.setCurrentLogger = function(logger) {
  175. if(typeof logger != 'function') throw new MongoError("current logger must be a function");
  176. currentLogger = logger;
  177. }
  178. /**
  179. * Set what classes to log.
  180. * @method
  181. * @param {string} type The type of filter (currently only class)
  182. * @param {string[]} values The filters to apply
  183. * @return {null}
  184. */
  185. Logger.filter = function(type, values) {
  186. if(type == 'class' && Array.isArray(values)) {
  187. filteredClasses = {};
  188. values.forEach(function(x) {
  189. filteredClasses[x] = true;
  190. });
  191. }
  192. }
  193. /**
  194. * Set the current log level
  195. * @method
  196. * @param {string} level Set current log level (debug, info, error)
  197. * @return {null}
  198. */
  199. Logger.setLevel = function(_level) {
  200. if(_level != 'info' && _level != 'error' && _level != 'debug' && _level != 'warn') {
  201. throw new Error(f("%s is an illegal logging level", _level));
  202. }
  203. level = _level;
  204. }
  205. module.exports = Logger;