3 var f = require('util').format
4 , MongoError = require('../error');
8 var filteredClasses = {};
10 // Save the process id
11 var pid = process.pid;
13 var currentLogger = null;
16 * Creates a new Logger instance
18 * @param {string} className The Class name associated with the logging instance
19 * @param {object} [options=null] Optional settings.
20 * @param {Function} [options.logger=null] Custom logger function;
21 * @param {string} [options.loggerLevel=error] Override default global log level.
22 * @return {Logger} a Logger instance.
24 var Logger = function(className, options) {
25 if(!(this instanceof Logger)) return new Logger(className, options);
26 options = options || {};
29 this.className = className;
33 currentLogger = options.logger;
34 } else if(currentLogger == null) {
35 currentLogger = console.log;
38 // Set level of logging, default is error
39 if(options.loggerLevel) {
40 level = options.loggerLevel || 'error';
43 // Add all class names
44 if(filteredClasses[this.className] == null) classFilters[this.className] = true;
48 * Log a message at the debug level
50 * @param {string} message The message to log
51 * @param {object} object additional meta data to log
54 Logger.prototype.debug = function(message, object) {
56 && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
57 || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
58 var dateTime = new Date().getTime();
59 var msg = f("[%s-%s:%s] %s %s", 'DEBUG', this.className, pid, dateTime, message);
61 type: 'debug', message: message, className: this.className, pid: pid, date: dateTime
63 if(object) state.meta = object;
64 currentLogger(msg, state);
69 * Log a message at the warn level
71 * @param {string} message The message to log
72 * @param {object} object additional meta data to log
75 Logger.prototype.warn = function(message, object) {
77 && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
78 || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
79 var dateTime = new Date().getTime();
80 var msg = f("[%s-%s:%s] %s %s", 'WARN', this.className, pid, dateTime, message);
82 type: 'warn', message: message, className: this.className, pid: pid, date: dateTime
84 if(object) state.meta = object;
85 currentLogger(msg, state);
90 * Log a message at the info level
92 * @param {string} message The message to log
93 * @param {object} object additional meta data to log
96 Logger.prototype.info = function(message, object) {
98 && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
99 || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
100 var dateTime = new Date().getTime();
101 var msg = f("[%s-%s:%s] %s %s", 'INFO', this.className, pid, dateTime, message);
103 type: 'info', message: message, className: this.className, pid: pid, date: dateTime
105 if(object) state.meta = object;
106 currentLogger(msg, state);
111 * Log a message at the error level
113 * @param {string} message The message to log
114 * @param {object} object additional meta data to log
117 Logger.prototype.error = function(message, object) {
119 && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
120 || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
121 var dateTime = new Date().getTime();
122 var msg = f("[%s-%s:%s] %s %s", 'ERROR', this.className, pid, dateTime, message);
124 type: 'error', message: message, className: this.className, pid: pid, date: dateTime
126 if(object) state.meta = object;
127 currentLogger(msg, state);
132 * Is the logger set at info level
136 Logger.prototype.isInfo = function() {
137 return level == 'info' || level == 'debug';
141 * Is the logger set at error level
145 Logger.prototype.isError = function() {
146 return level == 'error' || level == 'info' || level == 'debug';
150 * Is the logger set at error level
154 Logger.prototype.isWarn = function() {
155 return level == 'error' || level == 'warn' || level == 'info' || level == 'debug';
159 * Is the logger set at debug level
163 Logger.prototype.isDebug = function() {
164 return level == 'debug';
168 * Resets the logger to default settings, error and no filtered classes
172 Logger.reset = function() {
174 filteredClasses = {};
178 * Get the current logger function
182 Logger.currentLogger = function() {
183 return currentLogger;
187 * Set the current logger function
189 * @param {function} logger Logger function.
192 Logger.setCurrentLogger = function(logger) {
193 if(typeof logger != 'function') throw new MongoError("current logger must be a function");
194 currentLogger = logger;
198 * Set what classes to log.
200 * @param {string} type The type of filter (currently only class)
201 * @param {string[]} values The filters to apply
204 Logger.filter = function(type, values) {
205 if(type == 'class' && Array.isArray(values)) {
206 filteredClasses = {};
208 values.forEach(function(x) {
209 filteredClasses[x] = true;
215 * Set the current log level
217 * @param {string} level Set current log level (debug, info, error)
220 Logger.setLevel = function(_level) {
221 if(_level != 'info' && _level != 'error' && _level != 'debug' && _level != 'warn') {
222 throw new Error(f("%s is an illegal logging level", _level));
228 module.exports = Logger;