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