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