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 Logger(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() && (Object.keys(filteredClasses).length > 0 && filteredClasses[this.className] || Object.keys(filteredClasses).length == 0 && classFilters[this.className])) {
56 var dateTime = new Date().getTime();
57 var msg = f("[%s-%s:%s] %s %s", 'DEBUG', this.className, pid, dateTime, message);
58 var state = {
59 type: 'debug', message: message, className: this.className, pid: pid, date: dateTime
60 };
61 if (object) state.meta = object;
62 currentLogger(msg, state);
63 }
64};
65
66/**
67 * Log a message at the info level
68 * @method
69 * @param {string} message The message to log
70 * @param {object} object additional meta data to log
71 * @return {null}
72 */
73Logger.prototype.info = function (message, object) {
74 if (this.isInfo() && (Object.keys(filteredClasses).length > 0 && filteredClasses[this.className] || Object.keys(filteredClasses).length == 0 && classFilters[this.className])) {
75 var dateTime = new Date().getTime();
76 var msg = f("[%s-%s:%s] %s %s", 'INFO', this.className, pid, dateTime, message);
77 var state = {
78 type: 'info', message: message, className: this.className, pid: pid, date: dateTime
79 };
80 if (object) state.meta = object;
81 currentLogger(msg, state);
82 }
83},
84
85/**
86 * Log a message at the error level
87 * @method
88 * @param {string} message The message to log
89 * @param {object} object additional meta data to log
90 * @return {null}
91 */
92Logger.prototype.error = function (message, object) {
93 if (this.isError() && (Object.keys(filteredClasses).length > 0 && filteredClasses[this.className] || Object.keys(filteredClasses).length == 0 && classFilters[this.className])) {
94 var dateTime = new Date().getTime();
95 var msg = f("[%s-%s:%s] %s %s", 'ERROR', this.className, pid, dateTime, message);
96 var state = {
97 type: 'error', message: message, className: this.className, pid: pid, date: dateTime
98 };
99 if (object) state.meta = object;
100 currentLogger(msg, state);
101 }
102},
103
104/**
105 * Is the logger set at info level
106 * @method
107 * @return {boolean}
108 */
109Logger.prototype.isInfo = function () {
110 return level == 'info' || level == 'debug';
111},
112
113/**
114 * Is the logger set at error level
115 * @method
116 * @return {boolean}
117 */
118Logger.prototype.isError = function () {
119 return level == 'error' || level == 'info' || level == 'debug';
120},
121
122/**
123 * Is the logger set at debug level
124 * @method
125 * @return {boolean}
126 */
127Logger.prototype.isDebug = function () {
128 return level == 'debug';
129};
130
131/**
132 * Resets the logger to default settings, error and no filtered classes
133 * @method
134 * @return {null}
135 */
136Logger.reset = function () {
137 level = 'error';
138 filteredClasses = {};
139};
140
141/**
142 * Get the current logger function
143 * @method
144 * @return {function}
145 */
146Logger.currentLogger = function () {
147 return currentLogger;
148};
149
150/**
151 * Set the current logger function
152 * @method
153 * @param {function} logger Logger function.
154 * @return {null}
155 */
156Logger.setCurrentLogger = function (logger) {
157 if (typeof logger != 'function') throw new Error("current logger must be a function");
158 currentLogger = logger;
159};
160
161/**
162 * Set what classes to log.
163 * @method
164 * @param {string} type The type of filter (currently only class)
165 * @param {string[]} values The filters to apply
166 * @return {null}
167 */
168Logger.filter = function (type, values) {
169 if (type == 'class' && Array.isArray(values)) {
170 filteredClasses = {};
171
172 values.forEach(function (x) {
173 filteredClasses[x] = true;
174 });
175 }
176};
177
178/**
179 * Set the current log level
180 * @method
181 * @param {string} level Set current log level (debug, info, error)
182 * @return {null}
183 */
184Logger.setLevel = function (_level) {
185 if (_level != 'info' && _level != 'error' && _level != 'debug') throw new Error(f("%s is an illegal logging level", _level));
186 level = _level;
187};
188
189module.exports = Logger;