request-log-analyzer 1.3.5 → 1.3.6
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.
- data/lib/cli/database_console_init.rb +2 -1
- data/lib/request_log_analyzer.rb +1 -1
- data/lib/request_log_analyzer/aggregator.rb +1 -5
- data/lib/request_log_analyzer/aggregator/database_inserter.rb +4 -5
- data/lib/request_log_analyzer/controller.rb +10 -21
- data/lib/request_log_analyzer/database.rb +16 -91
- data/lib/request_log_analyzer/database/base.rb +4 -4
- data/lib/request_log_analyzer/database/request.rb +22 -0
- data/lib/request_log_analyzer/database/source.rb +13 -0
- data/lib/request_log_analyzer/database/warning.rb +14 -0
- data/lib/request_log_analyzer/file_format.rb +1 -13
- data/lib/request_log_analyzer/file_format/amazon_s3.rb +1 -2
- data/lib/request_log_analyzer/file_format/apache.rb +8 -10
- data/lib/request_log_analyzer/file_format/merb.rb +21 -5
- data/lib/request_log_analyzer/file_format/rails.rb +8 -14
- data/lib/request_log_analyzer/filter.rb +6 -10
- data/lib/request_log_analyzer/filter/anonymize.rb +2 -1
- data/lib/request_log_analyzer/log_processor.rb +6 -8
- data/lib/request_log_analyzer/request.rb +47 -35
- data/lib/request_log_analyzer/source.rb +4 -6
- data/lib/request_log_analyzer/source/database_loader.rb +3 -7
- data/lib/request_log_analyzer/source/log_parser.rb +3 -6
- data/lib/request_log_analyzer/tracker.rb +12 -19
- data/lib/request_log_analyzer/tracker/hourly_spread.rb +1 -2
- data/request-log-analyzer.gemspec +3 -3
- data/spec/database.yml +6 -0
- data/spec/unit/aggregator/database_inserter_spec.rb +3 -3
- data/spec/unit/database/base_class_spec.rb +9 -16
- data/spec/unit/database/database_spec.rb +9 -14
- data/spec/unit/tracker/tracker_api_spec.rb +111 -36
- 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 => :
|
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
|
73
|
-
analyze.
|
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
|
-
|
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
|
-
@
|
23
|
-
|
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
|
-
|
30
|
-
|
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
|
-
|
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
|
47
|
-
@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
|
-
|
16
|
-
|
17
|
-
|
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
|
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
|
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
|
70
|
+
else raise "Unknown duration unit"
|
63
71
|
end
|
64
72
|
end
|
65
73
|
end
|
66
|
-
|
67
|
-
|
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
|
78
|
-
|
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
|
-
#
|
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
|
52
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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.
|
4
|
-
s.date = "2009-09-
|
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/
|
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
|