|
1 | | -/*! loglevel - v1.2.0 - https://github.com/pimterry/loglevel - (c) 2014 Tim Perry - licensed MIT */ |
| 1 | +/*! loglevel - v1.4.0 - https://github.com/pimterry/loglevel - (c) 2015 Tim Perry - licensed MIT */ |
2 | 2 | (function (root, definition) { |
| 3 | + "use strict"; |
3 | 4 | if (typeof module === 'object' && module.exports && typeof require === 'function') { |
4 | 5 | module.exports = definition(); |
5 | 6 | } else if (typeof define === 'function' && typeof define.amd === 'object') { |
|
8 | 9 | root.log = definition(); |
9 | 10 | } |
10 | 11 | }(this, function () { |
11 | | - var self = {}; |
| 12 | + "use strict"; |
12 | 13 | var noop = function() {}; |
13 | 14 | var undefinedType = "undefined"; |
14 | 15 |
|
|
40 | 41 | } |
41 | 42 | } |
42 | 43 |
|
43 | | - function enableLoggingWhenConsoleArrives(methodName, level) { |
| 44 | + // these private functions always need `this` to be set properly |
| 45 | + |
| 46 | + function enableLoggingWhenConsoleArrives(methodName, level, loggerName) { |
44 | 47 | return function () { |
45 | 48 | if (typeof console !== undefinedType) { |
46 | | - replaceLoggingMethods(level); |
47 | | - self[methodName].apply(self, arguments); |
| 49 | + replaceLoggingMethods.call(this, level, loggerName); |
| 50 | + this[methodName].apply(this, arguments); |
48 | 51 | } |
49 | 52 | }; |
50 | 53 | } |
51 | 54 |
|
52 | | - var logMethods = [ |
53 | | - "trace", |
54 | | - "debug", |
55 | | - "info", |
56 | | - "warn", |
57 | | - "error" |
58 | | - ]; |
59 | | - |
60 | | - function replaceLoggingMethods(level) { |
| 55 | + function replaceLoggingMethods(level, loggerName) { |
| 56 | + /*jshint validthis:true */ |
61 | 57 | for (var i = 0; i < logMethods.length; i++) { |
62 | 58 | var methodName = logMethods[i]; |
63 | | - self[methodName] = (i < level) ? noop : self.methodFactory(methodName, level); |
| 59 | + this[methodName] = (i < level) ? |
| 60 | + noop : |
| 61 | + this.methodFactory(methodName, level, loggerName); |
64 | 62 | } |
65 | 63 | } |
66 | 64 |
|
67 | | - function persistLevelIfPossible(levelNum) { |
68 | | - var levelName = (logMethods[levelNum] || 'silent').toUpperCase(); |
69 | | - |
70 | | - // Use localStorage if available |
71 | | - try { |
72 | | - window.localStorage['loglevel'] = levelName; |
73 | | - return; |
74 | | - } catch (ignore) {} |
75 | | - |
76 | | - // Use session cookie as fallback |
77 | | - try { |
78 | | - window.document.cookie = "loglevel=" + levelName + ";"; |
79 | | - } catch (ignore) {} |
| 65 | + function defaultMethodFactory(methodName, level, loggerName) { |
| 66 | + /*jshint validthis:true */ |
| 67 | + return realMethod(methodName) || |
| 68 | + enableLoggingWhenConsoleArrives.apply(this, arguments); |
80 | 69 | } |
81 | 70 |
|
82 | | - function loadPersistedLevel() { |
83 | | - var storedLevel; |
84 | | - |
85 | | - try { |
86 | | - storedLevel = window.localStorage['loglevel']; |
87 | | - } catch (ignore) {} |
88 | | - |
89 | | - if (typeof storedLevel === undefinedType) { |
90 | | - try { |
91 | | - storedLevel = /loglevel=([^;]+)/.exec(window.document.cookie)[1]; |
92 | | - } catch (ignore) {} |
93 | | - } |
94 | | - |
95 | | - if (self.levels[storedLevel] === undefined) { |
96 | | - storedLevel = "WARN"; |
97 | | - } |
| 71 | + var logMethods = [ |
| 72 | + "trace", |
| 73 | + "debug", |
| 74 | + "info", |
| 75 | + "warn", |
| 76 | + "error" |
| 77 | + ]; |
98 | 78 |
|
99 | | - self.setLevel(self.levels[storedLevel]); |
| 79 | + function Logger(name, defaultLevel, factory) { |
| 80 | + var self = this; |
| 81 | + var currentLevel; |
| 82 | + var storageKey = "loglevel"; |
| 83 | + if (name) { |
| 84 | + storageKey += ":" + name; |
| 85 | + } |
| 86 | + |
| 87 | + function persistLevelIfPossible(levelNum) { |
| 88 | + var levelName = (logMethods[levelNum] || 'silent').toUpperCase(); |
| 89 | + |
| 90 | + // Use localStorage if available |
| 91 | + try { |
| 92 | + window.localStorage[storageKey] = levelName; |
| 93 | + return; |
| 94 | + } catch (ignore) {} |
| 95 | + |
| 96 | + // Use session cookie as fallback |
| 97 | + try { |
| 98 | + window.document.cookie = |
| 99 | + encodeURIComponent(storageKey) + "=" + levelName + ";"; |
| 100 | + } catch (ignore) {} |
| 101 | + } |
| 102 | + |
| 103 | + function getPersistedLevel() { |
| 104 | + var storedLevel; |
| 105 | + |
| 106 | + try { |
| 107 | + storedLevel = window.localStorage[storageKey]; |
| 108 | + } catch (ignore) {} |
| 109 | + |
| 110 | + if (typeof storedLevel === undefinedType) { |
| 111 | + try { |
| 112 | + var cookie = window.document.cookie; |
| 113 | + var location = cookie.indexOf( |
| 114 | + encodeURIComponent(storageKey) + "="); |
| 115 | + if (location) { |
| 116 | + storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1]; |
| 117 | + } |
| 118 | + } catch (ignore) {} |
| 119 | + } |
| 120 | + |
| 121 | + // If the stored level is not valid, treat it as if nothing was stored. |
| 122 | + if (self.levels[storedLevel] === undefined) { |
| 123 | + storedLevel = undefined; |
| 124 | + } |
| 125 | + |
| 126 | + return storedLevel; |
| 127 | + } |
| 128 | + |
| 129 | + /* |
| 130 | + * |
| 131 | + * Public API |
| 132 | + * |
| 133 | + */ |
| 134 | + |
| 135 | + self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3, |
| 136 | + "ERROR": 4, "SILENT": 5}; |
| 137 | + |
| 138 | + self.methodFactory = factory || defaultMethodFactory; |
| 139 | + |
| 140 | + self.getLevel = function () { |
| 141 | + return currentLevel; |
| 142 | + }; |
| 143 | + |
| 144 | + self.setLevel = function (level, persist) { |
| 145 | + if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) { |
| 146 | + level = self.levels[level.toUpperCase()]; |
| 147 | + } |
| 148 | + if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) { |
| 149 | + currentLevel = level; |
| 150 | + if (persist !== false) { // defaults to true |
| 151 | + persistLevelIfPossible(level); |
| 152 | + } |
| 153 | + replaceLoggingMethods.call(self, level, name); |
| 154 | + if (typeof console === undefinedType && level < self.levels.SILENT) { |
| 155 | + return "No console available for logging"; |
| 156 | + } |
| 157 | + } else { |
| 158 | + throw "log.setLevel() called with invalid level: " + level; |
| 159 | + } |
| 160 | + }; |
| 161 | + |
| 162 | + self.setDefaultLevel = function (level) { |
| 163 | + if (!getPersistedLevel()) { |
| 164 | + self.setLevel(level, false); |
| 165 | + } |
| 166 | + }; |
| 167 | + |
| 168 | + self.enableAll = function(persist) { |
| 169 | + self.setLevel(self.levels.TRACE, persist); |
| 170 | + }; |
| 171 | + |
| 172 | + self.disableAll = function(persist) { |
| 173 | + self.setLevel(self.levels.SILENT, persist); |
| 174 | + }; |
| 175 | + |
| 176 | + // Initialize with the right level |
| 177 | + var initialLevel = getPersistedLevel(); |
| 178 | + if (initialLevel == null) { |
| 179 | + initialLevel = defaultLevel == null ? "WARN" : defaultLevel; |
| 180 | + } |
| 181 | + self.setLevel(initialLevel, false); |
100 | 182 | } |
101 | 183 |
|
102 | 184 | /* |
103 | 185 | * |
104 | | - * Public API |
| 186 | + * Package-level API |
105 | 187 | * |
106 | 188 | */ |
107 | 189 |
|
108 | | - self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3, |
109 | | - "ERROR": 4, "SILENT": 5}; |
| 190 | + var defaultLogger = new Logger(); |
110 | 191 |
|
111 | | - self.methodFactory = function (methodName, level) { |
112 | | - return realMethod(methodName) || |
113 | | - enableLoggingWhenConsoleArrives(methodName, level); |
114 | | - }; |
115 | | - |
116 | | - self.setLevel = function (level) { |
117 | | - if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) { |
118 | | - level = self.levels[level.toUpperCase()]; |
119 | | - } |
120 | | - if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) { |
121 | | - persistLevelIfPossible(level); |
122 | | - replaceLoggingMethods(level); |
123 | | - if (typeof console === undefinedType && level < self.levels.SILENT) { |
124 | | - return "No console available for logging"; |
125 | | - } |
126 | | - } else { |
127 | | - throw "log.setLevel() called with invalid level: " + level; |
| 192 | + var _loggersByName = {}; |
| 193 | + defaultLogger.getLogger = function getLogger(name) { |
| 194 | + if (typeof name !== "string" || name === "") { |
| 195 | + throw new TypeError("You must supply a name when creating a logger."); |
128 | 196 | } |
129 | | - }; |
130 | | - |
131 | | - self.enableAll = function() { |
132 | | - self.setLevel(self.levels.TRACE); |
133 | | - }; |
134 | 197 |
|
135 | | - self.disableAll = function() { |
136 | | - self.setLevel(self.levels.SILENT); |
| 198 | + var logger = _loggersByName[name]; |
| 199 | + if (!logger) { |
| 200 | + logger = _loggersByName[name] = new Logger( |
| 201 | + name, defaultLogger.getLevel(), defaultLogger.methodFactory); |
| 202 | + } |
| 203 | + return logger; |
137 | 204 | }; |
138 | 205 |
|
139 | 206 | // Grab the current global log variable in case of overwrite |
140 | 207 | var _log = (typeof window !== undefinedType) ? window.log : undefined; |
141 | | - self.noConflict = function() { |
| 208 | + defaultLogger.noConflict = function() { |
142 | 209 | if (typeof window !== undefinedType && |
143 | | - window.log === self) { |
| 210 | + window.log === defaultLogger) { |
144 | 211 | window.log = _log; |
145 | 212 | } |
146 | 213 |
|
147 | | - return self; |
| 214 | + return defaultLogger; |
148 | 215 | }; |
149 | 216 |
|
150 | | - loadPersistedLevel(); |
151 | | - return self; |
| 217 | + return defaultLogger; |
152 | 218 | })); |
0 commit comments