|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 var LogController = {}; //create the logger object |
|
6 |
|
7 LogController.counter = 0; //current log message number |
|
8 LogController.listeners = []; |
|
9 LogController.logLevel = { |
|
10 FATAL: 50, |
|
11 ERROR: 40, |
|
12 WARNING: 30, |
|
13 INFO: 20, |
|
14 DEBUG: 10 |
|
15 }; |
|
16 |
|
17 /* set minimum logging level */ |
|
18 LogController.logLevelAtLeast = function(minLevel) { |
|
19 if (typeof(minLevel) == 'string') { |
|
20 minLevel = LogController.logLevel[minLevel]; |
|
21 } |
|
22 return function (msg) { |
|
23 var msgLevel = msg.level; |
|
24 if (typeof(msgLevel) == 'string') { |
|
25 msgLevel = LogController.logLevel[msgLevel]; |
|
26 } |
|
27 return msgLevel >= minLevel; |
|
28 }; |
|
29 }; |
|
30 |
|
31 /* creates the log message with the given level and info */ |
|
32 LogController.createLogMessage = function(level, info) { |
|
33 var msg = {}; |
|
34 msg.num = LogController.counter; |
|
35 msg.level = level; |
|
36 msg.info = info; |
|
37 msg.timestamp = new Date(); |
|
38 return msg; |
|
39 }; |
|
40 |
|
41 /* helper method to return a sub-array */ |
|
42 LogController.extend = function (args, skip) { |
|
43 var ret = []; |
|
44 for (var i = skip; i<args.length; i++) { |
|
45 ret.push(args[i]); |
|
46 } |
|
47 return ret; |
|
48 }; |
|
49 |
|
50 /* logs message with given level. Currently used locally by log() and error() */ |
|
51 LogController.logWithLevel = function(level, message/*, ...*/) { |
|
52 var msg = LogController.createLogMessage( |
|
53 level, |
|
54 LogController.extend(arguments, 1) |
|
55 ); |
|
56 LogController.dispatchListeners(msg); |
|
57 LogController.counter += 1; |
|
58 }; |
|
59 |
|
60 /* log with level INFO */ |
|
61 LogController.log = function(message/*, ...*/) { |
|
62 LogController.logWithLevel('INFO', message); |
|
63 }; |
|
64 |
|
65 /* log with level ERROR */ |
|
66 LogController.error = function(message/*, ...*/) { |
|
67 LogController.logWithLevel('ERROR', message); |
|
68 }; |
|
69 |
|
70 /* send log message to listeners */ |
|
71 LogController.dispatchListeners = function(msg) { |
|
72 for (var k in LogController.listeners) { |
|
73 var pair = LogController.listeners[k]; |
|
74 if (pair.ident != k || (pair[0] && !pair[0](msg))) { |
|
75 continue; |
|
76 } |
|
77 pair[1](msg); |
|
78 } |
|
79 }; |
|
80 |
|
81 /* add a listener to this log given an identifier, a filter (can be null) and the listener object */ |
|
82 LogController.addListener = function(ident, filter, listener) { |
|
83 if (typeof(filter) == 'string') { |
|
84 filter = LogController.logLevelAtLeast(filter); |
|
85 } else if (filter !== null && typeof(filter) !== 'function') { |
|
86 throw new Error("Filter must be a string, a function, or null"); |
|
87 } |
|
88 var entry = [filter, listener]; |
|
89 entry.ident = ident; |
|
90 LogController.listeners[ident] = entry; |
|
91 }; |
|
92 |
|
93 /* remove a listener from this log */ |
|
94 LogController.removeListener = function(ident) { |
|
95 delete LogController.listeners[ident]; |
|
96 }; |