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 sorter utility
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,24 +35,24 @@
35
35
 
36
36
 
37
37
  module Sawmill
38
-
39
-
38
+
39
+
40
40
  # An object that classifies log entry objects, calling the proper methods
41
41
  # on a Sawmill::EntryProcessor.
42
-
42
+
43
43
  class EntryClassifier
44
-
45
-
44
+
45
+
46
46
  # Create a classifier that sends entries to the given
47
47
  # Sawmill::EntryProcessor.
48
-
48
+
49
49
  def initialize(processor_)
50
50
  @processor = processor_
51
51
  end
52
-
53
-
52
+
53
+
54
54
  # Call this method to classify a log entry and send it to the processor.
55
-
55
+
56
56
  def entry(entry_)
57
57
  case entry_.type
58
58
  when :unknown_data
@@ -67,9 +67,9 @@ module Sawmill
67
67
  @processor.attribute(entry_)
68
68
  end
69
69
  end
70
-
71
-
70
+
71
+
72
72
  end
73
-
74
-
73
+
74
+
75
75
  end
@@ -1,15 +1,15 @@
1
1
  # -----------------------------------------------------------------------------
2
- #
2
+ #
3
3
  # Sawmill entry processor interface
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,83 +35,83 @@
35
35
 
36
36
 
37
37
  module Sawmill
38
-
39
-
38
+
39
+
40
40
  # Entry processors are objects that receive a stream of log entries and
41
41
  # perform some action. Some processors perform their own action, while
42
42
  # others could filter entries and forward them to other processors.
43
- #
43
+ #
44
44
  # The API contract for an entry processor is specified by the class
45
45
  # Sawmill::EntryProcessor::Base. Processors could subclass that base
46
46
  # class, or could just duck-type the methods.
47
- #
47
+ #
48
48
  # Sawmill's basic entry processor classes live into this module's
49
49
  # namespace, but this is not a requirement for your own processors.
50
-
50
+
51
51
  module EntryProcessor
52
-
53
-
52
+
53
+
54
54
  class Builder # :nodoc:
55
55
  include ::Blockenspiel::DSL
56
56
  end
57
-
58
-
57
+
58
+
59
59
  # A base class for entry processors.
60
- #
60
+ #
61
61
  # Entry processors need not necessarily subclass this class, but should
62
62
  # at least duck-type the methods.
63
- #
63
+ #
64
64
  # If a class subclasses this class, *and* lives in the EntryProcessor
65
65
  # namespace, then it will automatically be available in the build
66
66
  # interface. See EntryProcessor#build.
67
-
67
+
68
68
  class Base
69
-
70
-
69
+
70
+
71
71
  # Receive and process a Sawmill::Entry::BeginRecord.
72
-
72
+
73
73
  def begin_record(entry_)
74
74
  true
75
75
  end
76
-
77
-
76
+
77
+
78
78
  # Receive and process a Sawmill::Entry::EndRecord.
79
-
79
+
80
80
  def end_record(entry_)
81
81
  true
82
82
  end
83
-
84
-
83
+
84
+
85
85
  # Receive and process a Sawmill::Entry::Message.
86
-
86
+
87
87
  def message(entry_)
88
88
  true
89
89
  end
90
-
91
-
90
+
91
+
92
92
  # Receive and process a Sawmill::Entry::Attribute.
93
-
93
+
94
94
  def attribute(entry_)
95
95
  true
96
96
  end
97
-
98
-
97
+
98
+
99
99
  # Receive and process a Sawmill::Entry::UnknownData.
100
-
100
+
101
101
  def unknown_data(entry_)
102
102
  true
103
103
  end
104
-
105
-
104
+
105
+
106
106
  # Close down the processor, perform any finishing tasks, and return
107
107
  # any final calculated value.
108
- #
108
+ #
109
109
  # After this is called, the processor should ignore any further entries.
110
- #
110
+ #
111
111
  # The return value can be used to communicate a final computed value,
112
112
  # analysis report, or other data back to the caller. It may also be
113
113
  # nil, signalling no finish value.
114
- #
114
+ #
115
115
  # Note that some processors function to multiplex other processors. In
116
116
  # such a case, their finish value needs to be an aggregate of the
117
117
  # values returned by their descendants. To handle these cases, we
@@ -124,12 +124,12 @@ module Sawmill
124
124
  # actually return an array _as_ a value, you must wrap it in another
125
125
  # array, indicating "an array of one finish value, and that finish
126
126
  # value also happens to be an array itself".
127
-
127
+
128
128
  def finish
129
129
  nil
130
130
  end
131
-
132
-
131
+
132
+
133
133
  def self.inherited(subclass_) # :nodoc:
134
134
  if subclass_.name =~ /^Sawmill::EntryProcessor::([^:]+)$/
135
135
  name_ = $1
@@ -140,23 +140,23 @@ module Sawmill
140
140
  end
141
141
  end
142
142
  end
143
-
144
-
143
+
144
+
145
145
  # Add a method to the processor building DSL. You may call this method
146
146
  # in the DSL to create an instance of this entry processor.
147
147
  # You must pass a method name that begins with a lower-case letter or
148
148
  # underscore.
149
- #
149
+ #
150
150
  # Processors that subclass Sawmill::EntryProcessor::Base and live in
151
151
  # the Sawmill::EntryProcessor namespace will have their class name
152
152
  # automatically added to the DSL. This method is primarily for other
153
153
  # processors that do not live in that module namespace.
154
- #
154
+ #
155
155
  # See Sawmill::EntryProcessor#build for more information.
156
- #
156
+ #
157
157
  # Raises Sawmill::Errors::DSLMethodError if the given name is already
158
158
  # taken.
159
-
159
+
160
160
  def self.add_dsl_method(name_)
161
161
  klass_ = self
162
162
  if name_.to_s !~ /^[a-z_]/
@@ -171,14 +171,14 @@ module Sawmill
171
171
  end
172
172
  end
173
173
  end
174
-
175
-
174
+
175
+
176
176
  private
177
-
177
+
178
178
  def _interpret_processor_array(param_) # :nodoc:
179
179
  param_.flatten.map{ |processor_| _interpret_processor(processor_) }
180
180
  end
181
-
181
+
182
182
  def _interpret_processor(param_) # :nodoc:
183
183
  case param_
184
184
  when ::Class
@@ -189,33 +189,33 @@ module Sawmill
189
189
  raise ::ArgumentError, "Unknown processor object of type #{param_.class.name}"
190
190
  end
191
191
  end
192
-
193
-
192
+
193
+
194
194
  end
195
-
196
-
195
+
196
+
197
197
  # A convenience DSL for building sets of processors. This is typically
198
198
  # useful for constructing if-expressions using the boolean operation
199
199
  # processors.
200
- #
200
+ #
201
201
  # Every entry processor that lives in the Sawmill::EntryProcessor
202
202
  # module and subclasses Sawmill::EntryProcessor::Base can be
203
203
  # instantiated by using its name as a function call. Other processors
204
204
  # may also add themselves to the DSL by calling
205
205
  # Sawmill::EntryProcessor::Base#add_dsl_method.
206
- #
206
+ #
207
207
  # For example:
208
- #
208
+ #
209
209
  # Sawmill::EntryProcessor.build do
210
210
  # If(FilterByBasicFields(:level => :WARN), Format(STDOUT))
211
211
  # end
212
-
212
+
213
213
  def self.build(&block_)
214
214
  ::Blockenspiel.invoke(block_, Builder.new)
215
215
  end
216
-
217
-
216
+
217
+
218
218
  end
219
-
220
-
219
+
220
+
221
221
  end
@@ -1,15 +1,15 @@
1
1
  # -----------------------------------------------------------------------------
2
- #
2
+ #
3
3
  # Sawmill entry processor that builds log records
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,36 +35,36 @@
35
35
 
36
36
 
37
37
  module Sawmill
38
-
38
+
39
39
  module EntryProcessor
40
-
41
-
40
+
41
+
42
42
  # An entry processor that builds log records from a stream of entries,
43
43
  # and passes those log records to the given record processor.
44
-
44
+
45
45
  class BuildRecords < Base
46
-
47
-
46
+
47
+
48
48
  # Create record builder emitting to the given record processor.
49
- #
49
+ #
50
50
  # Recognized options include:
51
- #
51
+ #
52
52
  # [<tt>:emit_incomplete_records_on_finish</tt>]
53
53
  # When the processor is finished, any records that are still not
54
54
  # complete will be emitted to the record processor anyway, even
55
55
  # in their incomplete state.
56
-
56
+
57
57
  def initialize(processor_, opts_={})
58
58
  @processor = processor_
59
59
  @records = {}
60
60
  @emit_incomplete_records_on_finish = opts_[:emit_incomplete_records_on_finish]
61
61
  end
62
-
63
-
62
+
63
+
64
64
  # Emit all currently incomplete records immediately in their
65
65
  # incomplete state. This clears those incomplete records, so note that
66
66
  # if they do get completed later, they will not be re-emitted.
67
-
67
+
68
68
  def emit_incomplete_records
69
69
  if @records
70
70
  @records.values.each do |record_|
@@ -73,8 +73,8 @@ module Sawmill
73
73
  @records.clear
74
74
  end
75
75
  end
76
-
77
-
76
+
77
+
78
78
  def begin_record(entry_)
79
79
  return unless @records
80
80
  record_id_ = entry_.record_id
@@ -86,8 +86,8 @@ module Sawmill
86
86
  true
87
87
  end
88
88
  end
89
-
90
-
89
+
90
+
91
91
  def end_record(entry_)
92
92
  return unless @records
93
93
  record_ = @records.delete(entry_.record_id)
@@ -100,8 +100,8 @@ module Sawmill
100
100
  false
101
101
  end
102
102
  end
103
-
104
-
103
+
104
+
105
105
  def message(entry_)
106
106
  return unless @records
107
107
  record_ = @records[entry_.record_id]
@@ -113,8 +113,8 @@ module Sawmill
113
113
  false
114
114
  end
115
115
  end
116
-
117
-
116
+
117
+
118
118
  def attribute(entry_)
119
119
  return unless @records
120
120
  record_ = @records[entry_.record_id]
@@ -126,35 +126,35 @@ module Sawmill
126
126
  false
127
127
  end
128
128
  end
129
-
130
-
129
+
130
+
131
131
  def unknown_data(entry_)
132
132
  return unless @records
133
133
  @processor.extra_entry(entry_)
134
134
  false
135
135
  end
136
-
137
-
136
+
137
+
138
138
  def finish
139
139
  if @records
140
- emit_incomplete_records if @emit_incomplete_records_on_close
140
+ emit_incomplete_records if @emit_incomplete_records_on_finish
141
141
  @records = nil
142
142
  @processor.finish
143
143
  else
144
144
  nil
145
145
  end
146
146
  end
147
-
148
-
147
+
148
+
149
149
  end
150
-
151
-
150
+
151
+
152
152
  end
153
-
154
-
153
+
154
+
155
155
  # Sawmill::RecordBuilder is an alternate name for
156
156
  # Sawmill::EntryProcessor::BuildRecords
157
157
  RecordBuilder = EntryProcessor::BuildRecords
158
-
159
-
158
+
159
+
160
160
  end