UNPKG

5.25 kBJavaScriptView Raw
1"use strict";
2
3var f = require('util').format;
4
5// Filters for classes
6var classFilters = {};
7var filteredClasses = {};
8var level = null;
9// Save the process id
10var pid = process.pid;
11// current logger
12var currentLogger = null;
13
14/**
15 * Creates a new Logger instance
16 * @class
17 * @param {string} className The Class name associated with the logging instance
18 * @param {object} [options=null] Optional settings.
19 * @param {Function} [options.logger=null] Custom logger function;
20 * @param {string} [options.loggerLevel=error] Override default global log level.
21 * @return {Logger} a Logger instance.
22 */
23var Logger = function(className, options) {
24 if(!(this instanceof Logger)) return new Logger(className, options);
25 options = options || {};
26
27 // Current reference
28 var self = this;
29 this.className = className;
30
31 // Current logger
32 if(currentLogger == null && 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(level == null) {
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 */
54Logger.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 info level
70 * @method
71 * @param {string} message The message to log
72 * @param {object} object additional meta data to log
73 * @return {null}
74 */
75Logger.prototype.info = function(message, object) {
76 if(this.isInfo()
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", 'INFO', this.className, pid, dateTime, message);
81 var state = {
82 type: 'info', 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 error level
91 * @method
92 * @param {string} message The message to log
93 * @param {object} object additional meta data to log
94 * @return {null}
95 */
96Logger.prototype.error = function(message, object) {
97 if(this.isError()
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", 'ERROR', this.className, pid, dateTime, message);
102 var state = {
103 type: 'error', 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 * Is the logger set at info level
112 * @method
113 * @return {boolean}
114 */
115Logger.prototype.isInfo = function() {
116 return level == 'info' || level == 'debug';
117},
118
119/**
120 * Is the logger set at error level
121 * @method
122 * @return {boolean}
123 */
124Logger.prototype.isError = function() {
125 return level == 'error' || level == 'info' || level == 'debug';
126},
127
128/**
129 * Is the logger set at debug level
130 * @method
131 * @return {boolean}
132 */
133Logger.prototype.isDebug = function() {
134 return level == 'debug';
135}
136
137/**
138 * Resets the logger to default settings, error and no filtered classes
139 * @method
140 * @return {null}
141 */
142Logger.reset = function() {
143 level = 'error';
144 filteredClasses = {};
145}
146
147/**
148 * Get the current logger function
149 * @method
150 * @return {function}
151 */
152Logger.currentLogger = function() {
153 return currentLogger;
154}
155
156/**
157 * Set the current logger function
158 * @method
159 * @param {function} logger Logger function.
160 * @return {null}
161 */
162Logger.setCurrentLogger = function(logger) {
163 if(typeof logger != 'function') throw new Error("current logger must be a function");
164 currentLogger = logger;
165}
166
167/**
168 * Set what classes to log.
169 * @method
170 * @param {string} type The type of filter (currently only class)
171 * @param {string[]} values The filters to apply
172 * @return {null}
173 */
174Logger.filter = function(type, values) {
175 if(type == 'class' && Array.isArray(values)) {
176 filteredClasses = {};
177
178 values.forEach(function(x) {
179 filteredClasses[x] = true;
180 });
181 }
182}
183
184/**
185 * Set the current log level
186 * @method
187 * @param {string} level Set current log level (debug, info, error)
188 * @return {null}
189 */
190Logger.setLevel = function(_level) {
191 if(_level != 'info' && _level != 'error' && _level != 'debug') throw new Error(f("%s is an illegal logging level", _level));
192 level = _level;
193}
194
195module.exports = Logger;
\No newline at end of file