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 || {};
30 this.className = className;
34 currentLogger = options.logger;
35 } else if(currentLogger == null) {
36 currentLogger = console.log;
39 // Set level of logging, default is error
40 if(options.loggerLevel) {
41 level = options.loggerLevel || 'error';
44 // Add all class names
45 if(filteredClasses[this.className] == null) classFilters[this.className] = true;
49 * Log a message at the debug level
51 * @param {string} message The message to log
52 * @param {object} object additional meta data to log
55 Logger.prototype.debug = function(message, object) {
57 && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
58 || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
59 var dateTime = new Date().getTime();
60 var msg = f("[%s-%s:%s] %s %s", 'DEBUG', this.className, pid, dateTime, message);
62 type: 'debug', message: message, className: this.className, pid: pid, date: dateTime
64 if(object) state.meta = object;
65 currentLogger(msg, state);
70 * Log a message at the warn level
72 * @param {string} message The message to log
73 * @param {object} object additional meta data to log
76 Logger.prototype.warn = function(message, object) {
78 && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
79 || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
80 var dateTime = new Date().getTime();
81 var msg = f("[%s-%s:%s] %s %s", 'WARN', this.className, pid, dateTime, message);
83 type: 'warn', message: message, className: this.className, pid: pid, date: dateTime
85 if(object) state.meta = object;
86 currentLogger(msg, state);
91 * Log a message at the info level
93 * @param {string} message The message to log
94 * @param {object} object additional meta data to log
97 Logger.prototype.info = function(message, object) {
99 && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
100 || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
101 var dateTime = new Date().getTime();
102 var msg = f("[%s-%s:%s] %s %s", 'INFO', this.className, pid, dateTime, message);
104 type: 'info', message: message, className: this.className, pid: pid, date: dateTime
106 if(object) state.meta = object;
107 currentLogger(msg, state);
112 * Log a message at the error level
114 * @param {string} message The message to log
115 * @param {object} object additional meta data to log
118 Logger.prototype.error = function(message, object) {
120 && ((Object.keys(filteredClasses).length > 0 && filteredClasses[this.className])
121 || (Object.keys(filteredClasses).length == 0 && classFilters[this.className]))) {
122 var dateTime = new Date().getTime();
123 var msg = f("[%s-%s:%s] %s %s", 'ERROR', this.className, pid, dateTime, message);
125 type: 'error', message: message, className: this.className, pid: pid, date: dateTime
127 if(object) state.meta = object;
128 currentLogger(msg, state);
133 * Is the logger set at info level
137 Logger.prototype.isInfo = function() {
138 return level == 'info' || level == 'debug';
142 * Is the logger set at error level
146 Logger.prototype.isError = function() {
147 return level == 'error' || level == 'info' || level == 'debug';
151 * Is the logger set at error level
155 Logger.prototype.isWarn = function() {
156 return level == 'error' || level == 'warn' || level == 'info' || level == 'debug';
160 * Is the logger set at debug level
164 Logger.prototype.isDebug = function() {
165 return level == 'debug';
169 * Resets the logger to default settings, error and no filtered classes
173 Logger.reset = function() {
175 filteredClasses = {};
179 * Get the current logger function
183 Logger.currentLogger = function() {
184 return currentLogger;
188 * Set the current logger function
190 * @param {function} logger Logger function.
193 Logger.setCurrentLogger = function(logger) {
194 if(typeof logger != 'function') throw new MongoError("current logger must be a function");
195 currentLogger = logger;
199 * Set what classes to log.
201 * @param {string} type The type of filter (currently only class)
202 * @param {string[]} values The filters to apply
205 Logger.filter = function(type, values) {
206 if(type == 'class' && Array.isArray(values)) {
207 filteredClasses = {};
209 values.forEach(function(x) {
210 filteredClasses[x] = true;
216 * Set the current log level
218 * @param {string} level Set current log level (debug, info, error)
221 Logger.setLevel = function(_level) {
222 if(_level != 'info' && _level != 'error' && _level != 'debug' && _level != 'warn') {
223 throw new Error(f("%s is an illegal logging level", _level));
229 module.exports = Logger;