jlog-rails 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,370 @@
1
+ (function(JLog){
2
+ var anonymousLoggerName = "[anonymous]";
3
+ var defaultLoggerName = "[default]";
4
+ var rootLoggerName = "root";
5
+
6
+ var loggers = {};
7
+ var loggerNames = [];
8
+
9
+ var rootLogger = new Logger(rootLoggerName);
10
+ var rootLoggerDefaultLevel = JLog.Level.DEBUG;
11
+
12
+ rootLogger.setLevel(rootLoggerDefaultLevel);
13
+ JLog.getRootLogger = function() {
14
+ return rootLogger;
15
+ };
16
+
17
+ var defaultLogger = null;
18
+ JLog.getDefaultLogger = function() {
19
+ if (!defaultLogger) defaultLogger = JLog.getLogger(defaultLoggerName);
20
+ return defaultLogger;
21
+ };
22
+
23
+ /*
24
+ Class: Logger
25
+ Manager of logged events.
26
+ */
27
+ function Logger(name) {
28
+ this.parent = null;
29
+ this.children = [];
30
+
31
+ var _name = name;
32
+ var _appenders = [];
33
+ var _currentLevel = null;
34
+ var _isRoot = (_name === rootLoggerName);
35
+ var _enabled = true;
36
+
37
+ var _appenderCache = null;
38
+ var _appenderCacheInvalidated = false;
39
+
40
+ this.turnOn = function() { _enabled = true; };
41
+ this.turnOff = function() { _enabled = false; };
42
+ this.isOn = function() { return _enabled; };
43
+
44
+ this.getName = function() { return _name; }
45
+
46
+ var _additive = true;
47
+ /*
48
+ Method: getAdditivity
49
+
50
+ Get if log events are propagated higher in logger hierarchy.
51
+
52
+ Returns:
53
+ If events should be propagated higher.
54
+
55
+ See Also:
56
+ <setAdditivity>
57
+ */
58
+ this.getAdditivity = function() { return _additive; };
59
+
60
+ /*
61
+ Method: setAdditivity
62
+
63
+ Set if log events are propagated higher in logger hierarchy.
64
+
65
+ Parameters:
66
+ additivity - if events should be propagated higher.
67
+
68
+ See Also:
69
+ <getAdditivity>
70
+ */
71
+ this.setAdditivity = function(additivity) {
72
+ var valueChanged = (_additive != additivity);
73
+ _additive = additivity;
74
+ if(valueChanged) this._invalidateAppenderCache();
75
+ };
76
+
77
+ /*
78
+ Method: addChild
79
+
80
+ Makes given logger a child of current logger. If child is additive, all it's events will go through this logger
81
+ either.
82
+
83
+ Parameters:
84
+ childLogger - given logger.
85
+ */
86
+ this.addChild = function(childLogger) {
87
+ this.children.push(childLogger);
88
+ childLogger.parent = this;
89
+ childLogger._invalidateAppenderCache();
90
+ };
91
+
92
+ /*
93
+ Method: addAppender
94
+
95
+ Push an appender for this logger.
96
+
97
+ Parameters:
98
+ appender - appender to push.
99
+
100
+ See Also:
101
+ <removeAppender>
102
+ <removeAllAppenders>
103
+ */
104
+ this.addAppender = function(appender) {
105
+ if(_appenders.indexOf(appender) >= 0) return;
106
+ _appenders.push(appender);
107
+ this._invalidateAppenderCache();
108
+ };
109
+
110
+ /*
111
+ Method: removeAppender
112
+
113
+ Remove appender out of this logger.
114
+
115
+ Parameters:
116
+ appender - appender to remove.
117
+
118
+ See Also:
119
+ <addAppender>
120
+ <removeAllAppenders>
121
+ */
122
+ this.removeAppender = function(appender) {
123
+ _appenders.splice(_appenders.indexOf(appender), 1);
124
+ this._invalidateAppenderCache();
125
+ };
126
+
127
+ /*
128
+ Method: removeAllAppender
129
+
130
+ Remove all appenders from this logger.
131
+
132
+ See Also:
133
+ <addAppender>
134
+ <removeAppender>
135
+ */
136
+ this.removeAllAppenders = function() {
137
+ _appenders = [];
138
+ this._invalidateAppenderCache();
139
+ };
140
+
141
+ /*
142
+ Method: getEffectiveAppenders
143
+
144
+ Returns all appender which will log given message.
145
+ */
146
+ this.getEffectiveAppenders = function() {
147
+ if (_appenderCache === null || _appenderCacheInvalidated) {
148
+ // Build appender cache
149
+ var parentEffectiveAppenders = (_isRoot || !this.getAdditivity()) ? [] : this.parent.getEffectiveAppenders();
150
+ _appenderCache = _.union(parentEffectiveAppenders, _appenders);
151
+ _appenderCacheInvalidated = false;
152
+ }
153
+ return _appenderCache;
154
+ };
155
+
156
+ this._invalidateAppenderCache = function() {
157
+ _appenderCacheInvalidated = true;
158
+ _.each(this.children, function(c) { c._invalidateAppenderCache(); });
159
+ };
160
+
161
+ /*
162
+ Method: log
163
+
164
+ Publish logger message across all the appenders! Prefer using specialized function instead.
165
+
166
+ Parameters:
167
+ level - <Level> of message event
168
+ params - array of message parts. first parameter is usually a simple message.
169
+ */
170
+ this.log = function(level, params) {
171
+ try {
172
+ if(!(this.isOn() && level.isGreaterOrEqual(this._getEffectiveLevel()))) return;
173
+
174
+ params = Array.prototype.slice.call(params || []);
175
+
176
+ var exception;
177
+ var finalParamIndex = params.length - 1;
178
+ var lastParam = params[finalParamIndex];
179
+ if (params.length > 1 && (lastParam instanceof Error)) {
180
+ exception = lastParam;
181
+ --finalParamIndex;
182
+ }
183
+
184
+ var messages = finalParamIndex >= 0 ? params.slice(0, finalParamIndex + 1) : [];
185
+
186
+ var logEvent = new JLog.LoggingEvent(this, new Date(), level, messages, exception);
187
+
188
+ this._callAppenders(logEvent);
189
+ } catch(loggerError) {
190
+ JLog.handleError(loggerError);
191
+ // TODO deal with errors inside logger - user of the logger should not know about such a bugs, unless explicitly
192
+ // requested this!
193
+ }
194
+ };
195
+
196
+ this._callAppenders = function(logEvent) {
197
+ _.each(this.getEffectiveAppenders(), function(app) { app.doAppend(logEvent); });
198
+ };
199
+
200
+ /*
201
+ Method: setLevel
202
+
203
+ Set minimal level of log messages to populate.
204
+
205
+ Parameters:
206
+ level - minimal <Level>
207
+ */
208
+ this.setLevel = function(level) {
209
+ if(!(level instanceof JLog.Level)) throw new Error("Logger.setLevel: please use JLog.Level to set Level");
210
+ // Having a level of null on the root logger would be very bad.
211
+ if(_isRoot && level === null)
212
+ throw new Error("Logger.setLevel: you cannot set the level of the root logger to null");
213
+ _currentLevel = level;
214
+ };
215
+
216
+ /*
217
+ Method: getLevel
218
+
219
+ Get minimal level of log messages to populate.
220
+ */
221
+ this.getLevel = function() { return _currentLevel; };
222
+
223
+ this._getEffectiveLevel = function() {
224
+ for(var logger = this; logger !== null; logger = logger.parent) {
225
+ var level = logger.getLevel();
226
+ if(level !== null) return level;
227
+ }
228
+ };
229
+
230
+ this.toString = function() { return "Logger[" + this.getName() + "]"; };
231
+ };
232
+
233
+ Logger.prototype = {
234
+ /*
235
+ Method: debug
236
+
237
+ Attempt to publish <Level.DEBUG> message.
238
+ */
239
+ debug: function() {
240
+ this.log(JLog.Level.DEBUG, arguments);
241
+ },
242
+
243
+ /*
244
+ Method: info
245
+
246
+ Attempt to publish <Level.INFO> message.
247
+ */
248
+ info: function() {
249
+ this.log(JLog.Level.INFO, arguments);
250
+ },
251
+
252
+ /*
253
+ Method: warn
254
+
255
+ Attempt to publish <Level.WARN> message.
256
+ */
257
+ warn: function() {
258
+ this.log(JLog.Level.WARN, arguments);
259
+ },
260
+
261
+ /*
262
+ Method: error
263
+
264
+ Attempt to publish <Level.ERROR> message.
265
+ */
266
+ error: function() {
267
+ this.log(JLog.Level.ERROR, arguments);
268
+ },
269
+
270
+ /*
271
+ Method: fatal
272
+
273
+ Attempt to publish <Level.FATAL> message.
274
+ */
275
+ fatal: function() {
276
+ this.log(JLog.Level.FATAL, arguments);
277
+ },
278
+
279
+ /*
280
+ Method: isEnabledFor
281
+
282
+ Checks if logger will publish message of given <Level>.
283
+ */
284
+ isEnabledFor: function(level) {
285
+ return level >= this._getEffectiveLevel();
286
+ },
287
+
288
+ /*
289
+ Method: isDebugEnabled
290
+
291
+ Checks if logger will publish message of <Level.DEBUG>.
292
+ */
293
+ isDebugEnabled: function() {
294
+ return this.isEnabledFor(JLog.Level.DEBUG);
295
+ },
296
+
297
+ /*
298
+ Method: isInfoEnabled
299
+
300
+ Checks if logger will publish message of <Level.INFO>.
301
+ */
302
+ isInfoEnabled: function() {
303
+ return this.isEnabledFor(JLog.Level.INFO);
304
+ },
305
+
306
+ /*
307
+ Method: isWarnEnabled
308
+
309
+ Checks if logger will publish message of <Level.WARN>.
310
+ */
311
+ isWarnEnabled: function() {
312
+ return this.isEnabledFor(JLog.Level.WARN);
313
+ },
314
+
315
+ /*
316
+ Method: isErrorEnabled
317
+
318
+ Checks if logger will publish message of <Level.ERROR>.
319
+ */
320
+ isErrorEnabled: function() {
321
+ return this.isEnabledFor(JLog.Level.ERROR);
322
+ },
323
+
324
+ /*
325
+ Method: isFatalEnabled
326
+
327
+ Checks if logger will publish message of <Level.FATAL>.
328
+ */
329
+ isFatalEnabled: function() {
330
+ return this.isEnabledFor(JLog.Level.FATAL);
331
+ }
332
+ };
333
+
334
+ /*
335
+ Method: getLogger
336
+
337
+ Returns instance of logger for given hierarchy.
338
+
339
+ Parameters:
340
+ loggerName - dot separated logger name.
341
+
342
+ Returns:
343
+ <Logger> for given name.
344
+ */
345
+ JLog.getLogger = function(loggerName) {
346
+ // Use anonymous logger if loggerName is not specified or invalid
347
+ if (!(typeof loggerName == "string")) loggerName = anonymousLoggerName;
348
+
349
+ // Do not allow retrieval of the root logger by name
350
+ if (loggerName == rootLoggerName)
351
+ throw new Error("JLog.getLogger: root logger may not be obtained by name");
352
+
353
+ // Create the logger for this name if it doesn't already exist
354
+ if (!loggers[loggerName]) {
355
+ var logger = new Logger(loggerName);
356
+ loggers[loggerName] = logger;
357
+ loggerNames.push(loggerName);
358
+
359
+ // Set up parent logger, if it doesn't exist
360
+ var lastDotIndex = loggerName.lastIndexOf(".");
361
+ var parentLogger;
362
+ if(lastDotIndex > -1) {
363
+ var parentLoggerName = loggerName.substring(0, lastDotIndex);
364
+ parentLogger = JLog.getLogger(parentLoggerName); // Recursively sets up parents etc.
365
+ } else parentLogger = rootLogger;
366
+ parentLogger.addChild(logger);
367
+ }
368
+ return loggers[loggerName];
369
+ };
370
+ })(JLog);
@@ -0,0 +1,81 @@
1
+ /*
2
+ Class: LoggingEvent
3
+
4
+ Contains all the data about single log event.
5
+ */
6
+
7
+ /*
8
+ Constructor: LoggingEvent
9
+
10
+ Initializes event.
11
+
12
+ Parameters:
13
+ logger - <Logger> which was the event source
14
+ timeStamp - Date of event occurrence
15
+ level - <Level> of the log event
16
+ messages - Array of messages in event
17
+ exception - Exception of the message
18
+ */
19
+ JLog.LoggingEvent = function(logger, timeStamp, level, messages, exception) {
20
+ this.logger = logger;
21
+ this.timeStamp = timeStamp;
22
+ this.timeStampInMilliseconds = timeStamp.getTime();
23
+ this.timeStampInSeconds = Math.floor(this.timeStampInMilliseconds / 1000);
24
+ this.milliseconds = this.timeStamp.getMilliseconds();
25
+ this.level = level;
26
+ this.messages = messages;
27
+ this.exception = exception;
28
+ };
29
+
30
+ /*
31
+ Property: logger
32
+
33
+ <Logger> which was the event source
34
+ */
35
+
36
+ /*
37
+ Property: timeStamp
38
+
39
+ Date of event occurrence
40
+ */
41
+
42
+ /*
43
+ Property: level
44
+
45
+ <Level> of the log event
46
+ */
47
+
48
+ /*
49
+ Property: messages
50
+
51
+ Array of messages in event
52
+ */
53
+
54
+ /*
55
+ Property: exception
56
+
57
+ Exception of the message
58
+ */
59
+
60
+ JLog.LoggingEvent.prototype = {
61
+ /*
62
+ Method: getThrowableStrRep
63
+
64
+ Returns exception of the message as a String.
65
+ */
66
+ getThrowableStrRep: function() {
67
+ return this.exception ? getExceptionStringRep(this.exception) : "";
68
+ },
69
+
70
+ /*
71
+ Method: getCombinedMessages
72
+
73
+ Returns messages of the event joined with new line symbol.
74
+ */
75
+ getCombinedMessages: function() {
76
+ return (this.messages.length == 1) ? this.messages[0] : this.messages.join(newLine);
77
+ },
78
+ toString: function() {
79
+ return "LoggingEvent[" + this.level + "]";
80
+ }
81
+ };
@@ -0,0 +1,4 @@
1
+ var JLog = {
2
+ handleError: function(error) {},
3
+ startup: new Date()
4
+ };
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jlog-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Helios Technologies
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-21 00:00:00.000000000 Z
11
+ date: 2013-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jquery-rails
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: just_underscore
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: A lightweight JavaScript logger (for Rails)
28
42
  email: contact@heliostech.fr
29
43
  executables: []
@@ -46,7 +60,22 @@ files:
46
60
  - lib/jlog/formatters.rb
47
61
  - lib/jlog/version.rb
48
62
  - script/rails
63
+ - test/ajax-appender-test.js
64
+ - test/buster.js
65
+ - test/lib/jquery-1.9.1.min.js
66
+ - test/lib/underscore.js
67
+ - test/logger-test.js
68
+ - test/pattern-layout-test.js
69
+ - vendor/assets/javascripts/appender.js
70
+ - vendor/assets/javascripts/appenders/ajax.js
71
+ - vendor/assets/javascripts/appenders/console.js
49
72
  - vendor/assets/javascripts/jlog.js
73
+ - vendor/assets/javascripts/layout.js
74
+ - vendor/assets/javascripts/layouts/pattern.js
75
+ - vendor/assets/javascripts/levels.js
76
+ - vendor/assets/javascripts/logger.js
77
+ - vendor/assets/javascripts/logging_event.js
78
+ - vendor/assets/javascripts/mount.js
50
79
  homepage: http://rubygems.org/gems/jlog-rails
51
80
  licenses: []
52
81
  metadata: {}
@@ -70,4 +99,10 @@ rubygems_version: 2.0.3
70
99
  signing_key:
71
100
  specification_version: 4
72
101
  summary: Jlog for Rails
73
- test_files: []
102
+ test_files:
103
+ - test/ajax-appender-test.js
104
+ - test/buster.js
105
+ - test/lib/jquery-1.9.1.min.js
106
+ - test/lib/underscore.js
107
+ - test/logger-test.js
108
+ - test/pattern-layout-test.js