wvanbergen-request-log-analyzer 1.3.5 → 1.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. data/lib/cli/database_console_init.rb +2 -1
  2. data/lib/request_log_analyzer.rb +1 -1
  3. data/lib/request_log_analyzer/aggregator.rb +1 -5
  4. data/lib/request_log_analyzer/aggregator/database_inserter.rb +4 -5
  5. data/lib/request_log_analyzer/controller.rb +10 -21
  6. data/lib/request_log_analyzer/database.rb +16 -91
  7. data/lib/request_log_analyzer/database/base.rb +4 -4
  8. data/lib/request_log_analyzer/database/request.rb +22 -0
  9. data/lib/request_log_analyzer/database/source.rb +13 -0
  10. data/lib/request_log_analyzer/database/warning.rb +14 -0
  11. data/lib/request_log_analyzer/file_format.rb +1 -13
  12. data/lib/request_log_analyzer/file_format/amazon_s3.rb +1 -2
  13. data/lib/request_log_analyzer/file_format/apache.rb +8 -10
  14. data/lib/request_log_analyzer/file_format/merb.rb +21 -5
  15. data/lib/request_log_analyzer/file_format/rails.rb +8 -14
  16. data/lib/request_log_analyzer/filter.rb +6 -10
  17. data/lib/request_log_analyzer/filter/anonymize.rb +2 -1
  18. data/lib/request_log_analyzer/log_processor.rb +6 -8
  19. data/lib/request_log_analyzer/request.rb +47 -35
  20. data/lib/request_log_analyzer/source.rb +4 -6
  21. data/lib/request_log_analyzer/source/database_loader.rb +3 -7
  22. data/lib/request_log_analyzer/source/log_parser.rb +3 -6
  23. data/lib/request_log_analyzer/tracker.rb +12 -19
  24. data/lib/request_log_analyzer/tracker/hourly_spread.rb +1 -2
  25. data/request-log-analyzer.gemspec +3 -3
  26. data/spec/database.yml +6 -0
  27. data/spec/unit/aggregator/database_inserter_spec.rb +3 -3
  28. data/spec/unit/database/base_class_spec.rb +9 -16
  29. data/spec/unit/database/database_spec.rb +9 -14
  30. data/spec/unit/tracker/tracker_api_spec.rb +111 -36
  31. metadata +7 -4
@@ -5,11 +5,11 @@ module RequestLogAnalyzer::FileFormat
5
5
  # Processing EmployeeController#index (for 123.123.123.123 at 2008-07-13 06:00:00) [GET]
6
6
  line_definition :processing do |line|
7
7
  line.header = true # this line is the first log line for a request
8
- line.teaser = /Processing /
8
+ # line.teaser = /Processing /
9
9
  line.regexp = /Processing ((?:\w+::)?\w+)#(\w+)(?: to (\w+))? \(for (\d+\.\d+\.\d+\.\d+) at (\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)\) \[([A-Z]+)\]/
10
10
  line.captures << { :name => :controller, :type => :string } \
11
11
  << { :name => :action, :type => :string } \
12
- << { :name => :format, :type => :format } \
12
+ << { :name => :format, :type => :string, :default => 'html' } \
13
13
  << { :name => :ip, :type => :string } \
14
14
  << { :name => :timestamp, :type => :timestamp } \
15
15
  << { :name => :method, :type => :string }
@@ -46,7 +46,7 @@ module RequestLogAnalyzer::FileFormat
46
46
  line_definition :completed do |line|
47
47
 
48
48
  line.footer = true
49
- line.teaser = /Completed in /
49
+ # line.teaser = /Completed in /
50
50
  line.regexp = Regexp.new("(?:#{RAILS_21_COMPLETED}|#{RAILS_22_COMPLETED})")
51
51
 
52
52
  line.captures << { :name => :duration, :type => :duration, :unit => :sec } \
@@ -62,15 +62,15 @@ module RequestLogAnalyzer::FileFormat
62
62
  << { :name => :url, :type => :string } # 2.2 variant
63
63
  end
64
64
 
65
-
66
-
67
65
  REQUEST_CATEGORIZER = Proc.new do |request|
68
66
  "#{request[:controller]}##{request[:action]}.#{request[:format]} [#{request[:method]}]"
69
67
  end
70
68
 
71
69
  report do |analyze|
72
- analyze.timespan :line_type => :processing
73
- analyze.frequency :category => REQUEST_CATEGORIZER, :title => 'Top 20 hits', :amount => 20, :line_type => :processing
70
+ analyze.timespan
71
+ analyze.hourly_spread
72
+
73
+ analyze.frequency :category => REQUEST_CATEGORIZER, :title => 'Top 20 hits', :amount => 20
74
74
  analyze.frequency :method, :title => 'HTTP methods'
75
75
  analyze.frequency :status, :title => 'HTTP statuses returned'
76
76
  analyze.frequency :category => lambda { |request| request =~ :cache_hit ? 'Cache hit' : 'No hit' }, :title => 'Rails action cache hits'
@@ -82,23 +82,17 @@ module RequestLogAnalyzer::FileFormat
82
82
  analyze.frequency :category => REQUEST_CATEGORIZER, :title => 'Process blockers (> 1 sec duration)',
83
83
  :if => lambda { |request| request[:duration] && request[:duration] > 1.0 }, :amount => 20
84
84
 
85
- analyze.hourly_spread :line_type => :processing
86
85
  analyze.frequency :error, :title => 'Failed requests', :line_type => :failed, :amount => 20
87
86
  end
88
87
 
89
88
  # Define a custom Request class for the Rails file format to speed up timestamp handling
90
89
  # and to ensure that a format is always set.
91
90
  class Request < RequestLogAnalyzer::Request
92
-
91
+
93
92
  # Do not use DateTime.parse
94
93
  def convert_timestamp(value, definition)
95
94
  value.gsub(/[^0-9]/, '')[0...14].to_i unless value.nil?
96
95
  end
97
-
98
- # Set 'html' as default format for a request
99
- def convert_format(value, definition)
100
- value || 'html'
101
- end
102
96
  end
103
97
 
104
98
  end
@@ -7,28 +7,24 @@ module RequestLogAnalyzer::Filter
7
7
  end
8
8
 
9
9
  # Base filter class used to filter input requests.
10
- # All filters should interit from this base.
10
+ # All filters should interit from this base.
11
11
  class Base
12
12
 
13
- include RequestLogAnalyzer::FileFormat::Awareness
14
-
15
- attr_reader :log_parser
16
- attr_reader :options
13
+ attr_reader :file_format, :options
17
14
 
18
15
  # Initializer
19
16
  # <tt>format</tt> The file format
20
17
  # <tt>options</tt> Are passed to the filters.
21
18
  def initialize(format, options = {})
22
- @options = options
23
- register_file_format(format)
19
+ @file_format = format
20
+ @options = options
24
21
  end
25
22
 
26
23
  # Return the request if the request should be kept.
27
24
  # Return nil otherwise.
28
25
  def filter(request)
29
- return nil unless request
30
- return request
31
- end
26
+ request
27
+ end
32
28
  end
33
29
 
34
30
  end
@@ -19,7 +19,8 @@ module RequestLogAnalyzer::Filter
19
19
  value * ((75 + rand(50)) / 100.0)
20
20
  end
21
21
 
22
- def filter(request)
22
+ def filter(request)
23
+ # TODO: request.attributes is bad practice
23
24
  request.attributes.each do |key, value|
24
25
  if key == :ip
25
26
  request.attributes[key] = generate_random_ip
@@ -12,11 +12,9 @@ module RequestLogAnalyzer
12
12
  #
13
13
  class LogProcessor
14
14
 
15
- include RequestLogAnalyzer::FileFormat::Awareness
16
-
17
- attr_reader :mode, :options, :sources
15
+ attr_reader :mode, :options, :sources, :file_format
18
16
  attr_accessor :output_file
19
-
17
+
20
18
  # Builds a logprocessor instance from the arguments given on the command line
21
19
  # <tt>command</tt> The command hat was used to start the log processor. This will set the
22
20
  # processing mode. Currently, only :strip is supported.
@@ -43,11 +41,11 @@ module RequestLogAnalyzer
43
41
  # <tt>mode</tt> The processing mode
44
42
  # <tt>options</tt> A hash with options to take into account
45
43
  def initialize(format, mode, options = {})
46
- @options = options
47
- @mode = mode
48
- @sources = []
44
+ @options = options
45
+ @mode = mode
46
+ @sources = []
47
+ @file_format = format
49
48
  $output_file = nil
50
- self.register_file_format(format)
51
49
  end
52
50
 
53
51
  # Processes input files by opening it and sending the filestream to <code>process_io</code>,
@@ -9,73 +9,80 @@ module RequestLogAnalyzer
9
9
  # Request#every(field_name) returns all values corresponding to the given field name as array.
10
10
  class Request
11
11
 
12
+ def self.inherited(klass)
13
+ # klass.send(:include, Converters)
14
+ end
15
+
12
16
  module Converters
13
-
17
+
18
+ # Default converter function, which converts the parsed strings to a native Ruby type
19
+ # using the type indication in the line definition. It will use a custom connverter
20
+ # method if one is available.
14
21
  def convert_value(value, capture_definition)
15
- custom_converter_method = "convert_#{capture_definition[:type]}".to_sym
16
- if respond_to?(custom_converter_method)
17
- send(custom_converter_method, value, capture_definition)
18
- elsif !value.nil?
19
- case capture_definition[:type]
20
- when :decimal; value.to_f
21
- when :float; value.to_f
22
- when :double; value.to_f
23
- when :integer; value.to_i
24
- when :int; value.to_i
25
- when :symbol; value.to_sym
26
- else; value.to_s
27
- end
28
- else
29
- nil
30
- end
22
+ return capture_definition[:default] if value.nil?
23
+ custom_converter_method = :"convert_#{capture_definition[:type]}"
24
+ send(custom_converter_method, value, capture_definition)
31
25
  end
32
26
 
27
+ def convert_string(value, capture_definition); value; end
28
+ def convert_decimal(value, capture_definition); value.to_f; end
29
+ def convert_float(value, capture_definition); value.to_f; end
30
+ def convert_decimal(value, capture_definition); value.to_f; end
31
+ def convert_int(value, capture_definition); value.to_i; end
32
+ def convert_integer(value, capture_definition); value.to_i; end
33
+ def convert_sym(value, capture_definition); value.to_sym; end
34
+ def convert_symbol(value, capture_definition); value.to_sym; end
35
+
36
+ # Converts :eval field, which should evaluate to a hash.
33
37
  def convert_eval(value, capture_definition)
34
38
  eval(value).inject({}) { |h, (k, v)| h[k.to_sym] = v; h}
35
39
  rescue SyntaxError
36
40
  nil
37
41
  end
38
42
 
39
- # Slow default method to parse timestamps
43
+ # Slow default method to parse timestamps.
44
+ # Reimplement this function in a file format specific Request class
45
+ # to improve the timestamp parsing speed.
40
46
  def convert_timestamp(value, capture_definition)
41
- DateTime.parse(value).strftime('%Y%m%d%H%M%S').to_i unless value.nil?
47
+ DateTime.parse(value).strftime('%Y%m%d%H%M%S').to_i
42
48
  end
43
49
 
50
+ # Converts traffic fields to (whole) bytes based on the given unit.
44
51
  def convert_traffic(value, capture_definition)
45
- return nil if value.nil?
46
52
  case capture_definition[:unit]
53
+ when nil, :b, :B, :byte then value.to_i
47
54
  when :GB, :G, :gigabyte then (value.to_f * 1000_000_000).round
48
55
  when :GiB, :gibibyte then (value.to_f * (2 ** 30)).round
49
56
  when :MB, :M, :megabyte then (value.to_f * 1000_000).round
50
57
  when :MiB, :mebibyte then (value.to_f * (2 ** 20)).round
51
58
  when :KB, :K, :kilobyte, :kB then (value.to_f * 1000).round
52
59
  when :KiB, :kibibyte then (value.to_f * (2 ** 10)).round
53
- else value.to_i
60
+ else raise "Unknown traffic unit"
54
61
  end
55
62
  end
56
63
 
64
+ # Convert duration fields to float, and make sure the values are in seconds.
57
65
  def convert_duration(value, capture_definition)
58
- return nil if value.nil?
59
66
  case capture_definition[:unit]
67
+ when nil, :sec, :s then value.to_f
60
68
  when :microsec, :musec then value.to_f / 1000000.0
61
69
  when :msec, :millisec then value.to_f / 1000.0
62
- else value.to_f
70
+ else raise "Unknown duration unit"
63
71
  end
64
72
  end
65
73
  end
66
-
67
- include RequestLogAnalyzer::FileFormat::Awareness
74
+
75
+ # Install the default converter methods
68
76
  include Converters
69
-
70
- attr_reader :lines
71
- attr_reader :attributes
77
+
78
+ attr_reader :lines, :attributes, :file_format
72
79
 
73
80
  # Initializes a new Request object.
74
81
  # It will apply the the provided FileFormat module to this instance.
75
82
  def initialize(file_format, attributes = {})
76
- @lines = []
77
- @attributes = attributes
78
- register_file_format(file_format)
83
+ @lines = []
84
+ @attributes = attributes
85
+ @file_format = file_format
79
86
  end
80
87
 
81
88
  # Creates a new request that was parsed from the log with the given FileFormat. The hashes
@@ -86,8 +93,10 @@ module RequestLogAnalyzer
86
93
  return request
87
94
  end
88
95
 
89
- # Adds another line to the request.
90
- # The line should be provides as a hash of the fields parsed from the line.
96
+ # Adds another line to the request when it is parsed in the LogParser.
97
+ #
98
+ # The line should be provided as a hash with the attributes line_definition, :captures,
99
+ # :lineno and :source set. This function is called from LogParser.
91
100
  def add_parsed_line (parsed_line)
92
101
  value_hash = parsed_line[:line_definition].convert_captured_values(parsed_line[:captures], self)
93
102
  value_hash[:line_type] = parsed_line[:line_definition].name
@@ -96,12 +105,16 @@ module RequestLogAnalyzer
96
105
  add_line_hash(value_hash)
97
106
  end
98
107
 
108
+ # Adds another line to the request using a plain hash.
109
+ #
110
+ # The line should be provides as a hash of the fields parsed from the line.
99
111
  def add_line_hash(value_hash)
100
112
  @lines << value_hash
101
113
  @attributes = value_hash.merge(@attributes)
102
114
  end
103
115
 
104
-
116
+ # Adds another line to the request. This method switches automatically between
117
+ # the add_line_hash and add_parsed_line based on the keys of the provided hash.
105
118
  def <<(hash)
106
119
  hash[:line_definition] ? add_parsed_line(hash) : add_line_hash(hash)
107
120
  end
@@ -109,7 +122,6 @@ module RequestLogAnalyzer
109
122
  # Checks whether the given line type was parsed from the log file for this request
110
123
  def has_line_type?(line_type)
111
124
  return true if @lines.length == 1 && @lines[0][:line_type] == line_type.to_sym
112
-
113
125
  @lines.detect { |l| l[:line_type] == line_type.to_sym }
114
126
  end
115
127
 
@@ -21,9 +21,6 @@ module RequestLogAnalyzer::Source
21
21
  # RequestLogAnalyzer::Request instances that will be fed through the pipleine.
22
22
  class Base
23
23
 
24
- # Make the Spurce instance aware of the current file format
25
- include RequestLogAnalyzer::FileFormat::Awareness
26
-
27
24
  # A hash of options
28
25
  attr_reader :options
29
26
 
@@ -42,14 +39,15 @@ module RequestLogAnalyzer::Source
42
39
  # The total number of skipped requests because of filters.
43
40
  attr_reader :skipped_requests
44
41
 
45
-
42
+ # The FileFormat instance that describes the format of this source.
43
+ attr_reader :file_format
46
44
 
47
45
  # Initializer, which will register the file format and save any options given as a hash.
48
46
  # <tt>format</tt>:: The file format instance
49
47
  # <tt>options</tt>:: A hash of options that can be used by a specific Source implementation
50
48
  def initialize(format, options = {})
51
- @options = options
52
- register_file_format(format)
49
+ @options = options
50
+ @file_format = format
53
51
  end
54
52
 
55
53
  # The prepare method is called before the RequestLogAnalyzer::Source::Base#each_request method is called.
@@ -26,8 +26,7 @@ module RequestLogAnalyzer::Source
26
26
  # The Database class gets log data from the database.
27
27
  class DatabaseLoader < Base
28
28
 
29
- attr_reader :source_files
30
- attr_reader :requests
29
+ attr_reader :source_files, :file_format, :requests
31
30
 
32
31
  # Initializes the log file parser instance.
33
32
  # It will apply the language specific FileFormat module to this instance. It will use the line
@@ -35,14 +34,11 @@ module RequestLogAnalyzer::Source
35
34
  #
36
35
  # <tt>format</tt>:: The current file format instance
37
36
  # <tt>options</tt>:: A hash of options that are used by the parser
38
- def initialize(format, options = {})
39
- @line_definitions = {}
40
- @options = options
37
+ def initialize(format, options = {})
38
+ super(format, options)
41
39
  @source_files = options[:source_files]
42
40
  @parsed_requests = 0
43
41
  @requests = []
44
-
45
- self.register_file_format(format)
46
42
  end
47
43
 
48
44
  # Reads the input, which can either be a file, sequence of files or STDIN to parse
@@ -27,9 +27,8 @@ module RequestLogAnalyzer::Source
27
27
  #
28
28
  # <tt>format</tt>:: The current file format instance
29
29
  # <tt>options</tt>:: A hash of options that are used by the parser
30
- def initialize(format, options = {})
31
- @line_definitions = {}
32
- @options = options
30
+ def initialize(format, options = {})
31
+ super(format, options)
33
32
  @parsed_lines = 0
34
33
  @parsed_requests = 0
35
34
  @skipped_lines = 0
@@ -40,8 +39,6 @@ module RequestLogAnalyzer::Source
40
39
 
41
40
  @options[:parse_strategy] ||= DEFAULT_PARSE_STRATEGY
42
41
  raise "Unknown parse strategy" unless PARSE_STRATEGIES.include?(@options[:parse_strategy])
43
-
44
- self.register_file_format(format)
45
42
  end
46
43
 
47
44
  # Reads the input, which can either be a file, sequence of files or STDIN to parse
@@ -137,7 +134,7 @@ module RequestLogAnalyzer::Source
137
134
  def parse_io(io, options = {}, &block) # :yields: request
138
135
  @current_lineno = 1
139
136
  while line = io.gets
140
- @progress_handler.call(:progress, io.pos) if @progress_handler && @current_lineno % 127 == 0
137
+ @progress_handler.call(:progress, io.pos) if @progress_handler && (@current_lineno & 255 == 0)
141
138
 
142
139
  if request_data = file_format.parse_line(line) { |wt, message| warn(wt, message) }
143
140
  @parsed_lines += 1
@@ -29,6 +29,17 @@ module RequestLogAnalyzer::Tracker
29
29
  # * <tt>:line_type</tt> Line type this tracker will accept.
30
30
  def initialize(options ={})
31
31
  @options = options
32
+ setup_should_update_checks!
33
+ end
34
+
35
+ # Sets up the tracker's should_update? checks.
36
+ def setup_should_update_checks!
37
+ @should_update_checks = []
38
+ @should_update_checks.push( lambda { |request| request.has_line_type?(options[:line_type]) } ) if options[:line_type]
39
+ @should_update_checks.push(options[:if]) if options[:if].respond_to?(:call)
40
+ @should_update_checks.push( lambda { |request| request[options[:if]] }) if options[:if].kind_of?(Symbol)
41
+ @should_update_checks.push( lambda { |request| !options[:unless].call(request) }) if options[:unless].respond_to?(:call)
42
+ @should_update_checks.push( lambda { |request| !request[options[:unless]] }) if options[:unless].kind_of?(Symbol)
32
43
  end
33
44
 
34
45
  # Hook things that need to be done before running here.
@@ -55,25 +66,7 @@ module RequestLogAnalyzer::Tracker
55
66
  #
56
67
  # <tt>request</tt> The request object.
57
68
  def should_update?(request)
58
- return false if options[:line_type] && !request.has_line_type?(options[:line_type])
59
-
60
- if options[:if]
61
- if options[:if].kind_of?(Symbol)
62
- return false unless request[options[:if]]
63
- elsif options[:if].respond_to?(:call)
64
- return false unless options[:if].call(request)
65
- end
66
- end
67
-
68
- if options[:unless]
69
- if options[:unless].kind_of?(Symbol)
70
- return false if request[options[:unless]]
71
- elsif options[:unless].respond_to?(:call)
72
- return false if options[:unless].call(request)
73
- end
74
- end
75
-
76
- return true
69
+ @should_update_checks.all? { |c| c.call(request) }
77
70
  end
78
71
 
79
72
  # Hook report generation here.
@@ -41,8 +41,7 @@ module RequestLogAnalyzer::Tracker
41
41
  # Check if the timestamp in the request and store it.
42
42
  # <tt>request</tt> The request.
43
43
  def update(request)
44
- request = request.attributes
45
- timestamp = request[options[:field]]
44
+ timestamp = request.first(options[:field])
46
45
 
47
46
  @request_time_graph[timestamp.to_s[8..9].to_i] +=1
48
47
  @first = timestamp if @first.nil? || timestamp < @first
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "request-log-analyzer"
3
- s.version = "1.3.5"
4
- s.date = "2009-09-16"
3
+ s.version = "1.3.6"
4
+ s.date = "2009-09-20"
5
5
 
6
6
  s.rubyforge_project = 'r-l-a'
7
7
 
@@ -31,6 +31,6 @@ Gem::Specification.new do |s|
31
31
  s.email = ['willem@railsdoctors.com', 'bart@railsdoctors.com']
32
32
  s.homepage = 'http://railsdoctors.com'
33
33
 
34
- s.files = %w(spec/unit/filter/anonymize_filter_spec.rb lib/request_log_analyzer/line_definition.rb lib/request_log_analyzer/output/html.rb lib/request_log_analyzer/controller.rb spec/fixtures/rails_22_cached.log spec/lib/macros.rb lib/request_log_analyzer/file_format/rails_development.rb spec/fixtures/apache_combined.log spec/fixtures/apache_common.log spec/fixtures/merb_prefixed.log lib/request_log_analyzer/file_format/amazon_s3.rb tasks/request_log_analyzer.rake spec/unit/file_format/file_format_api_spec.rb spec/unit/file_format/apache_format_spec.rb spec/integration/command_line_usage_spec.rb lib/request_log_analyzer/database.rb spec/fixtures/decompression.log.bz2 spec/fixtures/rails_unordered.log lib/request_log_analyzer/log_processor.rb lib/request_log_analyzer/tracker.rb lib/request_log_analyzer/filter.rb bin/request-log-analyzer request-log-analyzer.gemspec DESIGN.rdoc spec/unit/filter/timespan_filter_spec.rb spec/unit/aggregator/database_inserter_spec.rb spec/lib/matchers.rb lib/request_log_analyzer/filter/field.rb lib/request_log_analyzer/tracker/frequency.rb spec/fixtures/decompression.log.gz spec/fixtures/decompression.log spec/lib/testing_format.rb spec/fixtures/test_order.log spec/fixtures/rails.db lib/request_log_analyzer/output/fixed_width.rb lib/request_log_analyzer/filter/anonymize.rb lib/request_log_analyzer/tracker/timespan.rb lib/request_log_analyzer/database/base.rb lib/request_log_analyzer/aggregator.rb lib/cli/progressbar.rb lib/request_log_analyzer/mailer.rb README.rdoc spec/fixtures/merb.log lib/request_log_analyzer/tracker/hourly_spread.rb .gitignore spec/unit/tracker/tracker_api_spec.rb spec/unit/tracker/duration_tracker_spec.rb spec/unit/file_format/amazon_s3_format_spec.rb lib/request_log_analyzer/aggregator/echo.rb spec/unit/controller/log_processor_spec.rb spec/spec_helper.rb lib/request_log_analyzer.rb spec/database.yml Rakefile lib/request_log_analyzer/database/connection.rb spec/unit/filter/filter_spec.rb spec/fixtures/test_language_combined.log lib/request_log_analyzer/aggregator/database_inserter.rb lib/request_log_analyzer/aggregator/summarizer.rb lib/request_log_analyzer/file_format/rack.rb lib/request_log_analyzer/file_format/rails.rb spec/fixtures/decompression.tar.gz spec/unit/tracker/traffic_tracker_spec.rb spec/unit/filter/field_filter_spec.rb spec/unit/database/base_class_spec.rb lib/request_log_analyzer/filter/timespan.rb lib/request_log_analyzer/source/log_parser.rb spec/fixtures/decompression.tgz spec/unit/tracker/timespan_tracker_spec.rb spec/unit/tracker/hourly_spread_spec.rb spec/fixtures/header_and_footer.log lib/cli/tools.rb lib/request_log_analyzer/file_format/merb.rb spec/fixtures/multiple_files_1.log spec/unit/file_format/merb_format_spec.rb spec/unit/file_format/line_definition_spec.rb lib/request_log_analyzer/source.rb lib/request_log_analyzer/request.rb lib/cli/database_console.rb spec/unit/database/connection_spec.rb spec/unit/controller/controller_spec.rb spec/lib/mocks.rb spec/lib/helpers.rb lib/cli/database_console_init.rb lib/request_log_analyzer/output.rb lib/request_log_analyzer/file_format/apache.rb spec/fixtures/rails_1x.log spec/fixtures/decompression.log.zip spec/unit/source/request_spec.rb spec/unit/source/log_parser_spec.rb spec/fixtures/test_file_format.log tasks/github-gem.rake spec/unit/database/database_spec.rb lib/request_log_analyzer/tracker/duration.rb lib/request_log_analyzer/tracker/traffic.rb lib/request_log_analyzer/file_format.rb spec/unit/aggregator/summarizer_spec.rb spec/fixtures/syslog_1x.log spec/fixtures/rails_22.log spec/fixtures/multiple_files_2.log LICENSE lib/request_log_analyzer/source/database_loader.rb spec/unit/tracker/frequency_tracker_spec.rb spec/unit/file_format/rails_format_spec.rb lib/cli/command_line_arguments.rb)
34
+ s.files = %w(spec/unit/filter/anonymize_filter_spec.rb spec/fixtures/rails_22_cached.log lib/request_log_analyzer/line_definition.rb lib/request_log_analyzer/output/html.rb lib/request_log_analyzer/controller.rb spec/lib/macros.rb lib/request_log_analyzer/file_format/rails_development.rb spec/fixtures/apache_combined.log spec/fixtures/apache_common.log spec/fixtures/merb_prefixed.log lib/request_log_analyzer/file_format/amazon_s3.rb tasks/request_log_analyzer.rake spec/unit/file_format/file_format_api_spec.rb spec/unit/file_format/apache_format_spec.rb spec/integration/command_line_usage_spec.rb lib/request_log_analyzer/database.rb spec/fixtures/decompression.log.bz2 spec/fixtures/rails_unordered.log lib/request_log_analyzer/log_processor.rb lib/request_log_analyzer/tracker.rb lib/request_log_analyzer/filter.rb bin/request-log-analyzer request-log-analyzer.gemspec DESIGN.rdoc spec/unit/filter/timespan_filter_spec.rb spec/unit/aggregator/database_inserter_spec.rb spec/lib/matchers.rb lib/request_log_analyzer/filter/field.rb lib/request_log_analyzer/tracker/frequency.rb spec/fixtures/decompression.log.gz spec/fixtures/decompression.log spec/lib/testing_format.rb spec/fixtures/test_order.log spec/fixtures/rails.db lib/request_log_analyzer/output/fixed_width.rb lib/request_log_analyzer/filter/anonymize.rb lib/request_log_analyzer/tracker/timespan.rb lib/request_log_analyzer/database/base.rb lib/request_log_analyzer/aggregator.rb lib/cli/progressbar.rb lib/request_log_analyzer/mailer.rb README.rdoc lib/request_log_analyzer/database/warning.rb spec/fixtures/merb.log lib/request_log_analyzer/tracker/hourly_spread.rb .gitignore spec/unit/tracker/tracker_api_spec.rb spec/unit/tracker/duration_tracker_spec.rb spec/unit/file_format/amazon_s3_format_spec.rb lib/request_log_analyzer/aggregator/echo.rb spec/unit/controller/log_processor_spec.rb spec/spec_helper.rb lib/request_log_analyzer.rb spec/database.yml Rakefile lib/request_log_analyzer/database/connection.rb spec/unit/filter/filter_spec.rb spec/fixtures/test_language_combined.log lib/request_log_analyzer/aggregator/database_inserter.rb lib/request_log_analyzer/aggregator/summarizer.rb lib/request_log_analyzer/file_format/rack.rb lib/request_log_analyzer/database/source.rb lib/request_log_analyzer/file_format/rails.rb spec/fixtures/decompression.tar.gz spec/unit/tracker/traffic_tracker_spec.rb spec/unit/filter/field_filter_spec.rb spec/unit/database/base_class_spec.rb lib/request_log_analyzer/filter/timespan.rb lib/request_log_analyzer/source/log_parser.rb spec/fixtures/decompression.tgz spec/unit/tracker/timespan_tracker_spec.rb spec/unit/tracker/hourly_spread_spec.rb spec/fixtures/header_and_footer.log lib/cli/tools.rb lib/request_log_analyzer/file_format/merb.rb spec/fixtures/multiple_files_1.log spec/unit/file_format/merb_format_spec.rb spec/unit/file_format/line_definition_spec.rb lib/request_log_analyzer/source.rb lib/request_log_analyzer/request.rb lib/cli/database_console.rb spec/unit/database/connection_spec.rb spec/unit/controller/controller_spec.rb spec/lib/mocks.rb spec/lib/helpers.rb spec/fixtures/rails_1x.log lib/cli/database_console_init.rb lib/request_log_analyzer/output.rb lib/request_log_analyzer/file_format/apache.rb spec/fixtures/decompression.log.zip spec/unit/source/request_spec.rb spec/unit/source/log_parser_spec.rb spec/fixtures/test_file_format.log tasks/github-gem.rake spec/unit/database/database_spec.rb lib/request_log_analyzer/tracker/duration.rb lib/request_log_analyzer/tracker/traffic.rb lib/request_log_analyzer/file_format.rb spec/unit/aggregator/summarizer_spec.rb spec/fixtures/syslog_1x.log spec/fixtures/rails_22.log lib/request_log_analyzer/database/request.rb spec/fixtures/multiple_files_2.log LICENSE lib/request_log_analyzer/source/database_loader.rb spec/unit/tracker/frequency_tracker_spec.rb spec/unit/file_format/rails_format_spec.rb lib/cli/command_line_arguments.rb)
35
35
  s.test_files = %w(spec/unit/filter/anonymize_filter_spec.rb spec/unit/file_format/file_format_api_spec.rb spec/unit/file_format/apache_format_spec.rb spec/integration/command_line_usage_spec.rb spec/unit/filter/timespan_filter_spec.rb spec/unit/aggregator/database_inserter_spec.rb spec/unit/tracker/tracker_api_spec.rb spec/unit/tracker/duration_tracker_spec.rb spec/unit/file_format/amazon_s3_format_spec.rb spec/unit/controller/log_processor_spec.rb spec/unit/filter/filter_spec.rb spec/unit/tracker/traffic_tracker_spec.rb spec/unit/filter/field_filter_spec.rb spec/unit/database/base_class_spec.rb spec/unit/tracker/timespan_tracker_spec.rb spec/unit/tracker/hourly_spread_spec.rb spec/unit/file_format/merb_format_spec.rb spec/unit/file_format/line_definition_spec.rb spec/unit/database/connection_spec.rb spec/unit/controller/controller_spec.rb spec/unit/source/request_spec.rb spec/unit/source/log_parser_spec.rb spec/unit/database/database_spec.rb spec/unit/aggregator/summarizer_spec.rb spec/unit/tracker/frequency_tracker_spec.rb spec/unit/file_format/rails_format_spec.rb)
36
36
  end