sawmill 0.1.15 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. data/History.rdoc +7 -0
  2. data/Version +1 -1
  3. data/lib/sawmill.rb +6 -6
  4. data/lib/sawmill/entry.rb +108 -108
  5. data/lib/sawmill/entry_classifier.rb +19 -19
  6. data/lib/sawmill/entry_processor.rb +63 -63
  7. data/lib/sawmill/entry_processor/build_records.rb +39 -39
  8. data/lib/sawmill/entry_processor/compile_report.rb +32 -32
  9. data/lib/sawmill/entry_processor/conditionals.rb +110 -110
  10. data/lib/sawmill/entry_processor/count_entries.rb +27 -27
  11. data/lib/sawmill/entry_processor/filter_by_basic_fields.rb +32 -32
  12. data/lib/sawmill/entry_processor/filter_by_block.rb +28 -28
  13. data/lib/sawmill/entry_processor/format.rb +41 -36
  14. data/lib/sawmill/entry_processor/interpret_stats.rb +24 -24
  15. data/lib/sawmill/entry_processor/simple_queue.rb +38 -38
  16. data/lib/sawmill/errors.rb +28 -28
  17. data/lib/sawmill/interface.rb +51 -51
  18. data/lib/sawmill/level.rb +75 -75
  19. data/lib/sawmill/log_record_middleware.rb +21 -21
  20. data/lib/sawmill/logger.rb +94 -94
  21. data/lib/sawmill/multi_parser.rb +28 -28
  22. data/lib/sawmill/parser.rb +32 -32
  23. data/lib/sawmill/railtie.rb +31 -31
  24. data/lib/sawmill/record.rb +74 -74
  25. data/lib/sawmill/record_processor.rb +54 -54
  26. data/lib/sawmill/record_processor/compile_report.rb +32 -32
  27. data/lib/sawmill/record_processor/conditionals.rb +92 -92
  28. data/lib/sawmill/record_processor/count_records.rb +24 -24
  29. data/lib/sawmill/record_processor/decompose.rb +21 -21
  30. data/lib/sawmill/record_processor/filter_by_attributes.rb +22 -22
  31. data/lib/sawmill/record_processor/filter_by_block.rb +29 -29
  32. data/lib/sawmill/record_processor/filter_by_record_id.rb +22 -22
  33. data/lib/sawmill/record_processor/format.rb +24 -24
  34. data/lib/sawmill/record_processor/simple_queue.rb +44 -44
  35. data/lib/sawmill/rotater.rb +60 -60
  36. data/lib/sawmill/rotater/base.rb +28 -28
  37. data/lib/sawmill/rotater/date_based_log_file.rb +50 -50
  38. data/lib/sawmill/rotater/shifting_log_file.rb +34 -34
  39. data/lib/sawmill/stats_middleware.rb +21 -21
  40. data/lib/sawmill/stats_railtie.rb +33 -33
  41. data/lib/sawmill/util/heap.rb +41 -41
  42. data/lib/sawmill/util/processor_tools.rb +17 -17
  43. data/lib/sawmill/util/queue.rb +33 -33
  44. data/lib/sawmill/version.rb +9 -9
  45. data/test/tc_entry_processors.rb +27 -27
  46. data/test/tc_formatter_parser.rb +40 -40
  47. data/test/tc_levels.rb +27 -27
  48. data/test/tc_logger.rb +49 -49
  49. data/test/tc_multi_parser.rb +18 -18
  50. data/test/tc_record_processors.rb +21 -21
  51. data/test/tc_records.rb +39 -39
  52. data/test/tc_reports.rb +19 -19
  53. metadata +10 -5
@@ -1,15 +1,15 @@
1
1
  # -----------------------------------------------------------------------------
2
- #
2
+ #
3
3
  # Sawmill entry processor that generates reports
4
- #
4
+ #
5
5
  # -----------------------------------------------------------------------------
6
6
  # Copyright 2009 Daniel Azuma
7
- #
7
+ #
8
8
  # All rights reserved.
9
- #
9
+ #
10
10
  # Redistribution and use in source and binary forms, with or without
11
11
  # modification, are permitted provided that the following conditions are met:
12
- #
12
+ #
13
13
  # * Redistributions of source code must retain the above copyright notice,
14
14
  # this list of conditions and the following disclaimer.
15
15
  # * Redistributions in binary form must reproduce the above copyright notice,
@@ -18,7 +18,7 @@
18
18
  # * Neither the name of the copyright holder, nor the names of any other
19
19
  # contributors to this software, may be used to endorse or promote products
20
20
  # derived from this software without specific prior written permission.
21
- #
21
+ #
22
22
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
23
  # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
24
  # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -35,21 +35,21 @@
35
35
 
36
36
 
37
37
  module Sawmill
38
-
39
-
38
+
39
+
40
40
  module EntryProcessor
41
-
42
-
41
+
42
+
43
43
  # This processor collects and formats reports from descendant
44
44
  # entry processors.
45
-
45
+
46
46
  class CompileReport < All
47
-
48
-
47
+
48
+
49
49
  # Create a report collection.
50
- #
50
+ #
51
51
  # Recognized options include:
52
- #
52
+ #
53
53
  # [<tt>:postprocessor</tt>]
54
54
  # Postprocessor proc for individual reports.
55
55
  # See to_postprocess_value.
@@ -62,7 +62,7 @@ module Sawmill
62
62
  # [<tt>:footer</tt>]
63
63
  # Footer string for the final compiled report.
64
64
  # Default is the empty string.
65
-
65
+
66
66
  def initialize(*children_)
67
67
  opts_ = children_.last.kind_of?(::Hash) ? children_.pop : {}
68
68
  @postprocessor = opts_[:postprocessor]
@@ -71,32 +71,32 @@ module Sawmill
71
71
  @footer = opts_[:footer] || ''
72
72
  super(*children_)
73
73
  end
74
-
75
-
74
+
75
+
76
76
  # Separator string to be inserted between individual reports.
77
77
  attr_accessor :separator
78
-
78
+
79
79
  # Header string for the final compiled report.
80
80
  attr_accessor :header
81
-
81
+
82
82
  # Footer string for the final compiled report.
83
83
  attr_accessor :footer
84
-
85
-
84
+
85
+
86
86
  # Provide a postprocessor block for individual report values.
87
87
  # This block should take a single parameter and return a string
88
88
  # that should be included in the compiled report. It may also
89
89
  # return nil to indicate that the data should not be included.
90
-
90
+
91
91
  def to_postprocess_value(&block_)
92
92
  @postprocessor = block_
93
93
  end
94
-
95
-
94
+
95
+
96
96
  # On finish, this processor calls finish on its descendants, converts
97
97
  # their values into strings and compiles them into a report. It then
98
98
  # returns that report as a string.
99
-
99
+
100
100
  def finish
101
101
  values_ = super || []
102
102
  values_ = [values_] unless values_.kind_of?(::Array)
@@ -104,12 +104,12 @@ module Sawmill
104
104
  values_.compact!
105
105
  "#{@header}#{values_.join(@separator)}#{@footer}"
106
106
  end
107
-
108
-
107
+
108
+
109
109
  end
110
-
111
-
110
+
111
+
112
112
  end
113
-
114
-
113
+
114
+
115
115
  end
@@ -1,15 +1,15 @@
1
1
  # -----------------------------------------------------------------------------
2
- #
2
+ #
3
3
  # Sawmill basic entry processors that implement conditionals
4
- #
4
+ #
5
5
  # -----------------------------------------------------------------------------
6
6
  # Copyright 2009 Daniel Azuma
7
- #
7
+ #
8
8
  # All rights reserved.
9
- #
9
+ #
10
10
  # Redistribution and use in source and binary forms, with or without
11
11
  # modification, are permitted provided that the following conditions are met:
12
- #
12
+ #
13
13
  # * Redistributions of source code must retain the above copyright notice,
14
14
  # this list of conditions and the following disclaimer.
15
15
  # * Redistributions in binary form must reproduce the above copyright notice,
@@ -18,7 +18,7 @@
18
18
  # * Neither the name of the copyright holder, nor the names of any other
19
19
  # contributors to this software, may be used to endorse or promote products
20
20
  # derived from this software without specific prior written permission.
21
- #
21
+ #
22
22
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
23
  # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
24
  # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -35,39 +35,39 @@
35
35
 
36
36
 
37
37
  module Sawmill
38
-
38
+
39
39
  module EntryProcessor
40
-
41
-
40
+
41
+
42
42
  # An "if" conditional.
43
- #
43
+ #
44
44
  # Takes a boolean condition processor and executes a processor on true
45
45
  # (and optionally another one on false).
46
- #
46
+ #
47
47
  # For example, this builds a processor that sends formatted log entries
48
48
  # to STDOUT only if their level is at least INFO:
49
- #
49
+ #
50
50
  # processor = Sawmill::EntryProcessor.build do
51
51
  # If(FilterByBasicFields(:level => :INFO), Format(STDOUT))
52
52
  # end
53
-
53
+
54
54
  class If < Base
55
-
56
-
55
+
56
+
57
57
  # Create an "if" conditional.
58
- #
58
+ #
59
59
  # The first parameter must be a processor whose methods return a
60
60
  # boolean value indicating whether the entry should be accepted.
61
61
  # The second parameter is a processor to run on accepted entries.
62
62
  # The optional third parameter is an "else" processor to run on
63
63
  # rejected entries.
64
-
64
+
65
65
  def initialize(condition_, on_true_, on_false_=nil)
66
66
  @condition = condition_
67
67
  @on_true = on_true_
68
68
  @on_false = on_false_
69
69
  end
70
-
70
+
71
71
  def begin_record(entry_)
72
72
  if @condition.begin_record(entry_)
73
73
  @on_true.begin_record(entry_)
@@ -75,7 +75,7 @@ module Sawmill
75
75
  @on_false.begin_record(entry_)
76
76
  end
77
77
  end
78
-
78
+
79
79
  def end_record(entry_)
80
80
  if @condition.end_record(entry_)
81
81
  @on_true.end_record(entry_)
@@ -83,7 +83,7 @@ module Sawmill
83
83
  @on_false.end_record(entry_)
84
84
  end
85
85
  end
86
-
86
+
87
87
  def message(entry_)
88
88
  if @condition.message(entry_)
89
89
  @on_true.message(entry_)
@@ -91,7 +91,7 @@ module Sawmill
91
91
  @on_false.message(entry_)
92
92
  end
93
93
  end
94
-
94
+
95
95
  def attribute(entry_)
96
96
  if @condition.attribute(entry_)
97
97
  @on_true.attribute(entry_)
@@ -99,7 +99,7 @@ module Sawmill
99
99
  @on_false.attribute(entry_)
100
100
  end
101
101
  end
102
-
102
+
103
103
  def unknown_data(entry_)
104
104
  if @condition.unknown_data(entry_)
105
105
  @on_true.unknown_data(entry_)
@@ -107,337 +107,337 @@ module Sawmill
107
107
  @on_false.unknown_data(entry_)
108
108
  end
109
109
  end
110
-
110
+
111
111
  def finish
112
112
  Util::ProcessorTools.collect_finish_values([@on_true, @on_false])
113
113
  end
114
-
115
-
114
+
115
+
116
116
  end
117
-
118
-
117
+
118
+
119
119
  # A boolean processor that returns the boolean negation of a given
120
120
  # processor.
121
- #
121
+ #
122
122
  # For example, this builds a processor that sends formatted log entries
123
123
  # to STDOUT only if their level is NOT at least INFO:
124
- #
124
+ #
125
125
  # processor = Sawmill::EntryProcessor.build do
126
126
  # If(Not(FilterByBasicFields(:level => :INFO)), Format(STDOUT))
127
127
  # end
128
-
128
+
129
129
  class Not < Base
130
-
131
-
130
+
131
+
132
132
  # Create a "not" boolean.
133
133
  # The parameter is a boolean processor to run. This processor returns
134
134
  # the boolean negation of its output.
135
-
135
+
136
136
  def initialize(child_)
137
137
  @child = _interpret_processor(child_)
138
138
  end
139
-
139
+
140
140
  def begin_record(entry_)
141
141
  !@child.begin_record(entry_)
142
142
  end
143
-
143
+
144
144
  def end_record(entry_)
145
145
  !@child.end_record(entry_)
146
146
  end
147
-
147
+
148
148
  def message(entry_)
149
149
  !@child.message(entry_)
150
150
  end
151
-
151
+
152
152
  def attribute(entry_)
153
153
  !@child.attribute(entry_)
154
154
  end
155
-
155
+
156
156
  def unknown_data(entry_)
157
157
  !@child.unknown_data(entry_)
158
158
  end
159
-
159
+
160
160
  def finish
161
161
  @child.finish
162
162
  end
163
-
164
-
163
+
164
+
165
165
  end
166
-
167
-
166
+
167
+
168
168
  # A boolean processor that returns true if and only if all its child
169
169
  # processors return true. This version short-circuits the processing,
170
170
  # so once one child returns false, subsequent children are not called
171
171
  # at all.
172
- #
172
+ #
173
173
  # For example, this builds a processor that sends formatted log entries
174
174
  # to STDOUT only if their level is at least INFO AND the progname is
175
175
  # is "rails":
176
- #
176
+ #
177
177
  # processor = Sawmill::EntryProcessor.build do
178
178
  # If(And(FilterByBasicFields(:level => :INFO),
179
179
  # FilterByBasicFields(:progname => 'rails')),
180
180
  # Format(STDOUT))
181
181
  # end
182
-
182
+
183
183
  class And < Base
184
-
185
-
184
+
185
+
186
186
  # Create an "and" boolean.
187
187
  # The parameters are child processors whose return values should be
188
188
  # combined with an AND operation.
189
-
189
+
190
190
  def initialize(*children_)
191
191
  @children = _interpret_processor_array(children_)
192
192
  end
193
-
193
+
194
194
  def begin_record(entry_)
195
195
  @children.each do |child_|
196
196
  return false unless child_.begin_record(entry_)
197
197
  end
198
198
  true
199
199
  end
200
-
200
+
201
201
  def end_record(entry_)
202
202
  @children.each do |child_|
203
203
  return false unless child_.end_record(entry_)
204
204
  end
205
205
  true
206
206
  end
207
-
207
+
208
208
  def message(entry_)
209
209
  @children.each do |child_|
210
210
  return false unless child_.message(entry_)
211
211
  end
212
212
  true
213
213
  end
214
-
214
+
215
215
  def attribute(entry_)
216
216
  @children.each do |child_|
217
217
  return false unless child_.attribute(entry_)
218
218
  end
219
219
  true
220
220
  end
221
-
221
+
222
222
  def unknown_data(entry_)
223
223
  @children.each do |child_|
224
224
  return false unless child_.unknown_data(entry_)
225
225
  end
226
226
  true
227
227
  end
228
-
228
+
229
229
  def finish
230
230
  Util::ProcessorTools.collect_finish_values(@children)
231
231
  end
232
-
233
-
232
+
233
+
234
234
  end
235
-
236
-
235
+
236
+
237
237
  # A boolean processor that returns true if and only if any of its child
238
238
  # processors returns true. This version short-circuits the processing,
239
239
  # so once one child returns true, subsequent children are not called
240
240
  # at all.
241
- #
241
+ #
242
242
  # For example, this builds a processor that sends formatted log entries
243
243
  # to STDOUT only if their level is at least INFO OR the progname is
244
244
  # "rails":
245
- #
245
+ #
246
246
  # processor = Sawmill::EntryProcessor.build do
247
247
  # If(Or(FilterByBasicFields(:level => :INFO),
248
248
  # FilterByBasicFields(:progname => 'rails')),
249
249
  # Format(STDOUT))
250
250
  # end
251
-
251
+
252
252
  class Or < Base
253
-
254
-
253
+
254
+
255
255
  # Create an "or" boolean.
256
256
  # The parameters are child processors whose return values should be
257
257
  # combined with an OR operation.
258
-
258
+
259
259
  def initialize(*children_)
260
260
  @children = _interpret_processor_array(children_)
261
261
  end
262
-
262
+
263
263
  def begin_record(entry_)
264
264
  @children.each do |child_|
265
265
  return true if child_.begin_record(entry_)
266
266
  end
267
267
  false
268
268
  end
269
-
269
+
270
270
  def end_record(entry_)
271
271
  @children.each do |child_|
272
272
  return true if child_.end_record(entry_)
273
273
  end
274
274
  false
275
275
  end
276
-
276
+
277
277
  def message(entry_)
278
278
  @children.each do |child_|
279
279
  return true if child_.message(entry_)
280
280
  end
281
281
  false
282
282
  end
283
-
283
+
284
284
  def attribute(entry_)
285
285
  @children.each do |child_|
286
286
  return true if child_.attribute(entry_)
287
287
  end
288
288
  false
289
289
  end
290
-
290
+
291
291
  def unknown_data(entry_)
292
292
  @children.each do |child_|
293
293
  return true if child_.unknown_data(entry_)
294
294
  end
295
295
  false
296
296
  end
297
-
297
+
298
298
  def finish
299
299
  Util::ProcessorTools.collect_finish_values(@children)
300
300
  end
301
-
302
-
301
+
302
+
303
303
  end
304
-
305
-
304
+
305
+
306
306
  # A boolean processor that returns true if and only if all its child
307
307
  # processors return true. This version does not short-circuit the
308
308
  # processing, so all children are always called even if an early one
309
309
  # returns false. Thus, this processor is also a good one to use as a
310
310
  # multiplexor to simply run a bunch of processors.
311
- #
311
+ #
312
312
  # For example, this builds a processor that sends formatted log entries
313
313
  # to STDOUT only if their level is at least INFO AND the progname is
314
314
  # "rails":
315
- #
315
+ #
316
316
  # processor = Sawmill::EntryProcessor.build do
317
317
  # If(All(FilterByBasicFields(:level => :INFO),
318
318
  # FilterByBasicFields(:progname => 'rails')),
319
319
  # Format(STDOUT))
320
320
  # end
321
- #
321
+ #
322
322
  # This processor just formats both to STDOUT and STDERR:
323
- #
323
+ #
324
324
  # processor = Sawmill::EntryProcessor.build do
325
325
  # All(Format(STDOUT), Format(STDERR))
326
326
  # end
327
-
327
+
328
328
  class All < Base
329
-
330
-
329
+
330
+
331
331
  # Create an "all" boolean.
332
332
  # The parameters are child processors whose return values should be
333
333
  # combined with an AND operation.
334
-
334
+
335
335
  def initialize(*children_)
336
336
  @children = _interpret_processor_array(children_)
337
337
  end
338
-
338
+
339
339
  def begin_record(entry_)
340
340
  @children.inject(true) do |result_, child_|
341
341
  child_.begin_record(entry_) && result_
342
342
  end
343
343
  end
344
-
344
+
345
345
  def end_record(entry_)
346
346
  @children.inject(true) do |result_, child_|
347
347
  child_.end_record(entry_) && result_
348
348
  end
349
349
  end
350
-
350
+
351
351
  def message(entry_)
352
352
  @children.inject(true) do |result_, child_|
353
353
  child_.message(entry_) && result_
354
354
  end
355
355
  end
356
-
356
+
357
357
  def attribute(entry_)
358
358
  @children.inject(true) do |result_, child_|
359
359
  child_.attribute(entry_) && result_
360
360
  end
361
361
  end
362
-
362
+
363
363
  def unknown_data(entry_)
364
364
  @children.inject(true) do |result_, child_|
365
365
  child_.unknown_data(entry_) && result_
366
366
  end
367
367
  end
368
-
368
+
369
369
  def finish
370
370
  Util::ProcessorTools.collect_finish_values(@children)
371
371
  end
372
-
373
-
372
+
373
+
374
374
  end
375
-
376
-
375
+
376
+
377
377
  # A boolean processor that returns true if and only if any of its child
378
378
  # processors returns true. This version does not short-circuit the
379
379
  # processing, so all children are always called even if an early one
380
380
  # returns true.
381
- #
381
+ #
382
382
  # For example, this builds a processor that sends formatted log entries
383
383
  # to STDOUT only if their level is at least INFO OR the progname is
384
384
  # "rails":
385
- #
385
+ #
386
386
  # processor = Sawmill::EntryProcessor.build do
387
387
  # If(Any(FilterByBasicFields(:level => :INFO),
388
388
  # FilterByBasicFields(:progname => 'rails')),
389
389
  # Format(STDOUT))
390
390
  # end
391
-
391
+
392
392
  class Any < Base
393
-
394
-
393
+
394
+
395
395
  # Create an "any" boolean.
396
396
  # The parameters are child processors whose return values should be
397
397
  # combined with an OR operation.
398
-
398
+
399
399
  def initialize(*children_)
400
400
  @children = _interpret_processor_array(children_)
401
401
  end
402
-
402
+
403
403
  def begin_record(entry_)
404
404
  @children.inject(false) do |result_, child_|
405
405
  child_.begin_record(entry_) || result_
406
406
  end
407
407
  end
408
-
408
+
409
409
  def end_record(entry_)
410
410
  @children.inject(false) do |result_, child_|
411
411
  child_.end_record(entry_) || result_
412
412
  end
413
413
  end
414
-
414
+
415
415
  def message(entry_)
416
416
  @children.inject(false) do |result_, child_|
417
417
  child_.message(entry_) || result_
418
418
  end
419
419
  end
420
-
420
+
421
421
  def attribute(entry_)
422
422
  @children.inject(false) do |result_, child_|
423
423
  child_.attribute(entry_) || result_
424
424
  end
425
425
  end
426
-
426
+
427
427
  def unknown_data(entry_)
428
428
  @children.inject(false) do |result_, child_|
429
429
  child_.unknown_data(entry_) || result_
430
430
  end
431
431
  end
432
-
432
+
433
433
  def finish
434
434
  Util::ProcessorTools.collect_finish_values(@children)
435
435
  end
436
-
437
-
436
+
437
+
438
438
  end
439
-
440
-
439
+
440
+
441
441
  end
442
-
442
+
443
443
  end