erkki-production_log_analyzer 2009022401

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,297 @@
1
+ $TESTING = true
2
+
3
+ require 'tempfile'
4
+ require 'test/unit'
5
+ require 'stringio'
6
+
7
+ require 'production_log/parser'
8
+
9
+ class TestLogEntry < Test::Unit::TestCase
10
+
11
+ def setup
12
+ @entry = LogParser::LogEntry.new <<-EOF
13
+ Processing TwinklerController#index (for 81.109.96.173 at Wed Dec 01 16:01:56 CST 2004)
14
+ Parameters: {\"action\"=>\"index\", \"controller\"=>\"twinkler\"}
15
+ Browser Load First (0.001114) SELECT * FROM browsers WHERE ubid = 'ixsXHgUo7U9PJGgBzr7e9ocaDOc=' LIMIT 1
16
+ Goal Count (0.001762) SELECT COUNT(*) FROM goals WHERE browser_id = '96181' and is_active = 1
17
+ Rendering twinkler/index within layouts/default
18
+ Rendering layouts/default (200 OK)
19
+ Completed in 0.616122 (1 reqs/sec) | Rendering: 0.242475 (39%) | DB: 0.002876 (0%)
20
+ EOF
21
+
22
+ @kong_entry = LogParser::LogEntry.new <<-EOF
23
+ Completed in 0.57672 (1 reqs/sec) | Rendering: 0.47752 (82%) | DB: 0.08223 (14%) | Rows: 75 | Queries: 32 | Method: GET | Request Size: 0 | Request Type: unknown | Response Format: html | Response Size: 71604 | Processed: FeaturedGamesController#index | 200 OK [http://www.kongregatetrunk.com/]
24
+ EOF
25
+ end
26
+
27
+ def test_parse
28
+ request = <<-EOF
29
+ Processing RssController#uber (for 67.18.200.5 at Mon Mar 07 00:00:25 CST 2005)
30
+ Parameters: {:id=>"author", :"rss/uber/author.html/uber/author"=>nil, :action=>"uber", :username=>"looch", :controller=>"rss"}
31
+ Cookie set: auth=dc%2FGUP20BwziF%2BApGecc0pXB0PF0obi55az63ubAFtsnOOdJPkhfJH2U09yuzQD3WtdmWnydLzFcRA78kwi7Gw%3D%3D; path=/; expires=Thu, 05 Mar 2015 06:00:25 GMT
32
+ Cookie set: ubid=kF05DqFH%2F9hRCOxTz%2Bfb8Q7UV%2FI%3D; path=/; expires=Thu, 05 Mar 2015 06:00:25 GMT
33
+ Browser Load (0.003963) SELECT * FROM browsers WHERE ubid = 'kF05DqFH/9hRCOxTz+fb8Q7UV/I=' LIMIT 1
34
+ Person Load (0.002445) SELECT * FROM people WHERE username = 'looch' AND active = '1' LIMIT 1
35
+ ProfileImage Load (0.001554) SELECT * FROM profile_images WHERE id = 2782 LIMIT 1
36
+ Rendering rss/rss2.0 (200 OK)
37
+ Completed in 0.034519 (28 reqs/sec) | Rendering: 0.011770 (34%) | DB: 0.007962 (23%)
38
+ EOF
39
+ request = request.split "\n"
40
+
41
+ entry = LogParser::LogEntry.new []
42
+
43
+ entry.parse request
44
+ assert_kind_of LogParser::LogEntry, entry
45
+ assert_equal "RssController#uber", entry.page
46
+ assert_equal 3, entry.queries.length
47
+ assert_equal ['Browser Load', 0.003963], entry.queries.first
48
+ assert_equal 0.034519, entry.request_time
49
+ end
50
+
51
+ def test_kong_style_page
52
+ assert_equal "FeaturedGamesController#index.html", @kong_entry.page
53
+ end
54
+
55
+ def test_bad_kong_entry
56
+ assert_nothing_raised do
57
+ bad = LogParser::LogEntry.new <<-EOF
58
+ Completed in 0.00904 (110 reqs/sec) | Rendering: 0.00572 (63%) | DB: 0.00093 (10%) | Rows: 2 | Queries: 2 | Guest | Method: GET | Request Size: 0 | Request Type: unknown | Response Format: Accept: application/xhtml+xml | Response Size: 8637 | Processed: MyCardsController#show | 200 OK [http://www.kongregate.com/accounts/orc22/cards/688263]
59
+ EOF
60
+ end
61
+ end
62
+
63
+ def test_row_count
64
+ assert_equal 75, @kong_entry.row_count
65
+ end
66
+
67
+ def test_query_count
68
+ assert_equal 32, @kong_entry.query_count
69
+ end
70
+
71
+ def test_request_size
72
+ assert_equal 0, @kong_entry.request_size
73
+ end
74
+
75
+ def test_response_size
76
+ assert_equal 71604, @kong_entry.response_size
77
+ end
78
+
79
+ def test_page
80
+ assert_equal "TwinklerController#index", @entry.page
81
+ end
82
+
83
+ def test_ip
84
+ assert_equal "81.109.96.173", @entry.ip
85
+ end
86
+
87
+ def test_time
88
+ assert_equal "Wed Dec 01 16:01:56 CST 2004", @entry.time
89
+ end
90
+
91
+ def test_queries
92
+ expected = []
93
+ expected << ["Browser Load First", 0.001114]
94
+ expected << ["Goal Count", 0.001762]
95
+ assert_equal expected, @entry.queries
96
+ end
97
+
98
+ def test_request_time
99
+ assert_equal 0.616122, @entry.request_time
100
+
101
+ @entry = LogParser::LogEntry.new "Processing TwinklerController#add_thing (for 144.164.232.114 at Wed Dec 01 16:01:56 CST 2004)
102
+ Completed in 0.261485 (3 reqs/sec) | DB: 0.009325 (3%)"
103
+
104
+ assert_equal 0.261485, @entry.request_time
105
+ end
106
+
107
+ def test_render_time
108
+ assert_equal 0.242475, @entry.render_time
109
+
110
+ @entry = LogParser::LogEntry.new "Processing TwinklerController#add_thing (for 144.164.232.114 at Wed Dec 01 16:01:56 CST 2004)
111
+ Completed in 0.261485 (3 reqs/sec) | DB: 0.009325 (3%)"
112
+
113
+ assert_equal 0, @entry.render_time
114
+ end
115
+
116
+ def test_db_time
117
+ assert_equal 0.002876, @entry.db_time
118
+ end
119
+
120
+ end
121
+
122
+ class TestLogParser < Test::Unit::TestCase
123
+
124
+ def test_class_parse_with_only_completed_at
125
+ log = StringIO.new <<-EOF
126
+ Jul 23 12:08:50 trunk rails[27221]: Completed in 0.00507 (197 reqs/sec) | Rendering: 0.00027 (5%) | DB: 0.00055 (10%) | Rows: 88 | Queries: 1 | Guest | Method: GET | Request Size: 0 | Request Type: unknown | Response Format: all | Response Size: 3696 | Processed: RoomsController#list | 200 OK [http://kongregate.com/rooms/list]
127
+ Jul 23 12:09:18 trunk rails[27221]: Completed in 0.11838 (8 reqs/sec) | Rendering: 0.10371 (87%) | DB: 0.00671 (5%) | Rows: 103 | Queries: 20 | Guest | Method: GET | Request Size: 0 | Request Type: unknown | Response Format: html | Response Size: 27254 | Processed: CategoriesController#show | 200 OK [http://kongregate.com/strategy-defense-games]
128
+ EOF
129
+
130
+ entries = []
131
+ LogParser.parse log do |entry|
132
+ entries << entry
133
+ end
134
+
135
+ assert_equal 2, entries.length
136
+ end
137
+
138
+ def test_class_parse
139
+ log = StringIO.new <<-EOF
140
+ Mar 7 00:00:25 online1 rails[59628]: Processing RssController#uber (for 67.18.200.5 at Mon Mar 07 00:00:25 CST 2005)
141
+ Mar 7 00:00:25 online1 rails[59628]: Parameters: {:id=>"author", :"rss/uber/author.html/uber/author"=>nil, :action=>"uber", :username=>"looch", :controller=>"rss"}
142
+ Mar 7 00:00:25 online1 rails[59628]: Cookie set: auth=dc%2FGUP20BwziF%2BApGecc0pXB0PF0obi55az63ubAFtsnOOdJPkhfJH2U09yuzQD3WtdmWnydLzFcRA78kwi7Gw%3D%3D; path=/; expires=Thu, 05 Mar 2015 06:00:25 GMT
143
+ Mar 7 00:00:25 online1 rails[59628]: Cookie set: ubid=kF05DqFH%2F9hRCOxTz%2Bfb8Q7UV%2FI%3D; path=/; expires=Thu, 05 Mar 2015 06:00:25 GMT
144
+ Mar 7 00:00:25 online1 rails[59628]: Browser Load (0.003963) SELECT * FROM browsers WHERE ubid = 'kF05DqFH/9hRCOxTz+fb8Q7UV/I=' LIMIT 1
145
+ Mar 7 00:00:25 online1 rails[59628]: Person Load (0.002445) SELECT * FROM people WHERE username = 'looch' AND active = '1' LIMIT 1
146
+ Mar 7 00:00:25 online1 rails[59628]: ProfileImage Load (0.001554) SELECT * FROM profile_images WHERE id = 2782 LIMIT 1
147
+ Mar 7 00:00:25 online1 rails[59628]: Rendering rss/rss2.0 (200 OK)
148
+ Mar 7 00:00:25 online1 rails[59628]: Completed in 0.034519 (28 reqs/sec) | Rendering: 0.011770 (34%) | DB: 0.007962 (23%)
149
+ EOF
150
+
151
+ entries = []
152
+
153
+ LogParser.parse log do |entry|
154
+ entries << entry
155
+ end
156
+
157
+ assert_equal 1, entries.length
158
+ assert_equal 'RssController#uber', entries.first.page
159
+ end
160
+
161
+ def test_class_parse_components
162
+ log = StringIO.new <<-EOF
163
+ Jul 11 10:05:20 www rails[61243]: Processing ChatroomsController#launch (for 213.152.37.169 at Mon Jul 11 10:05:20 CDT 2005)
164
+ Jul 11 10:05:20 www rails[61243]: Start rendering component ({:action=>"online_count", :controller=>"members"}):
165
+ Jul 11 10:05:20 www rails[34216]: Processing ChatroomsController#launch (for 213.152.37.169 at Mon Jul 11 10:05:20 CDT 2005)
166
+ Jul 11 10:05:20 www rails[34216]: Start rendering component ({:action=>"online_count", :controller=>"members"}):
167
+ Jul 11 10:05:20 www rails[34216]: Processing MembersController#online_count (for 213.152.37.169 at Mon Jul 11 10:05:20 CDT 2005)
168
+ Jul 11 10:05:20 www rails[34216]: Completed in 0.00741 (135 reqs/sec) | DB: 0.00320 (43%)
169
+ Jul 11 10:05:20 www rails[34216]: End of component rendering
170
+ Jul 11 10:05:28 www rails[34216]: Completed in 8.65005 (0 reqs/sec) | Rendering: 8.64820 (99%) | DB: 0.00000 (0%)
171
+ Jul 11 10:05:20 www rails[34216]: Processing ChatroomsController#launch (for 213.152.37.169 at Mon Jul 11 10:05:20 CDT 2005)
172
+ Jul 11 10:05:20 www rails[34216]: Start rendering component ({:action=>"online_count", :controller=>"members"}):
173
+ Jul 11 10:05:20 www rails[34216]: Processing MembersController#online_count (for 213.152.37.169 at Mon Jul 11 10:05:20 CDT 2005)
174
+ Jul 11 10:05:20 www rails[34216]: Completed in 0.00741 (135 reqs/sec) | DB: 0.00320 (43%)
175
+ Jul 11 10:05:20 www rails[34216]: End of component rendering
176
+ Jul 11 10:05:28 www rails[34216]: Completed in 8.65005 (0 reqs/sec) | Rendering: 8.64820 (99%) | DB: 0.00000 (0%)
177
+ Jul 11 10:05:20 www rails[61243]: Processing MembersController#online_count (for 213.152.37.169 at Mon Jul 11 10:05:20 CDT 2005)
178
+ Jul 11 10:05:20 www rails[61243]: Completed in 0.00741 (135 reqs/sec) | DB: 0.00320 (43%)
179
+ Jul 11 10:05:20 www rails[61243]: End of component rendering
180
+ Jul 11 10:05:28 www rails[61243]: Completed in 8.65005 (0 reqs/sec) | Rendering: 8.64820 (99%) | DB: 0.00000 (0%)
181
+ EOF
182
+
183
+ entries = []
184
+ LogParser.parse(log) { |entry| entries << entry }
185
+
186
+ assert_equal 3, entries.length
187
+ assert_equal 'ChatroomsController#launch', entries.first.page
188
+ assert_equal 8.65005, entries.first.request_time
189
+ end
190
+
191
+ def test_class_parse_entries_with_pre_processing_garbage
192
+ log = StringIO.new <<-EOF
193
+ Jan 03 12:51:34 duo2 rails[4347]: Font Load (0.000475) SELECT * FROM fonts ORDER BY name 
194
+ Jan 03 12:51:34 duo2 rails[4347]: Processing StylesheetsController#show (for 127.0.0.1 at 2007-01-03 12:51:34) [GET]
195
+ Jan 03 12:51:34 duo2 rails[4347]: Parameters: {"action"=>"show", "id"=>"1", "controller"=>"stylesheets"}
196
+ Jan 03 12:51:34 duo2 rails[4347]: Newspaper Load (0.000970) SELECT newspapers.* FROM newspapers INNER JOIN users ON newspapers.editor_in_chief = users.id WHERE (users.login = 'geoff') LIMIT 1
197
+ Jan 03 12:51:34 duo2 rails[4347]: Layout Load (0.000501) SELECT * FROM layouts WHERE (layouts.id = 1) LIMIT 1
198
+ Jan 03 12:51:34 duo2 rails[4347]: Completed in 0.00807 (123 reqs/sec) | Rendering: 0.00006 (0%) | DB: 0.00195 (24%) | 200 OK [http://geoff.localhost.com/stylesheets/show/1/styles.css]
199
+ EOF
200
+
201
+ entries = []
202
+ LogParser.parse(log) { |entry| entries << entry }
203
+
204
+ assert_equal 1, entries.length, "Number of entries was incorrect"
205
+ assert_equal 'StylesheetsController#show', entries.first.page
206
+ assert_equal 0.00807, entries.first.request_time
207
+ end
208
+
209
+ def test_class_parse_rails_engines_plugin
210
+ log = StringIO.new <<-EOF
211
+ Jan 03 12:24:21 duo2 rails[4277]: Trying to start engine 'login_engine' from '/Users/topfunky/web/rails/repos/roughunderbelly/vendor/plugins/login_engine'
212
+ Jan 03 12:24:21 duo2 rails[4277]: adding /Users/topfunky/web/rails/repos/roughunderbelly/vendor/plugins/login_engine/lib/login_engine to the load path
213
+ Jan 03 12:24:21 duo2 rails[4277]: adding /Users/topfunky/web/rails/repos/roughunderbelly/vendor/plugins/login_engine/app/views/user_notify to the load path
214
+ Jan 03 12:24:21 duo2 rails[4277]: adding /Users/topfunky/web/rails/repos/roughunderbelly/vendor/plugins/login_engine/app/views/user to the load path
215
+ Jan 03 12:24:21 duo2 rails[4277]: adding /Users/topfunky/web/rails/repos/roughunderbelly/vendor/plugins/login_engine/app/views to the load path
216
+ Jan 03 12:24:21 duo2 rails[4277]: adding /Users/topfunky/web/rails/repos/roughunderbelly/vendor/plugins/login_engine/app/models to the load path
217
+ Jan 03 12:24:21 duo2 rails[4277]: adding /Users/topfunky/web/rails/repos/roughunderbelly/vendor/plugins/login_engine/app/helpers to the load path
218
+ Jan 03 12:24:21 duo2 rails[4277]: adding /Users/topfunky/web/rails/repos/roughunderbelly/vendor/plugins/login_engine/app/controllers to the load path
219
+ Jan 03 12:24:21 duo2 rails[4277]: Attempting to copy public engine files from '/Users/topfunky/web/rails/repos/roughunderbelly/config/../vendor/plugins/login_engine/public'
220
+ Jan 03 12:24:21 duo2 rails[4277]: source dirs: ["/Users/topfunky/web/rails/repos/roughunderbelly/config/../vendor/plugins/login_engine/public/stylesheets"]
221
+ Jan 03 12:24:22 duo2 rails[4277]: finally loading from application: 'exception_notifier.rb'
222
+ Jan 03 12:24:22 duo2 rails[4277]: requiring file 'exception_notifier_helper'
223
+ Jan 03 12:24:22 duo2 rails[4277]: checking 'login_engine' for /Users/topfunky/web/rails/repos/roughunderbelly/config/../vendor/plugins/login_engine/exception_notifier_helper.rb
224
+ Jan 03 12:24:22 duo2 rails[4277]: finally loading from application: 'exception_notifier_helper.rb'
225
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: '/Users/topfunky/web/rails/repos/roughunderbelly/config/../app/controllers/application.rb'
226
+ Jan 03 12:24:23 duo2 rails[4277]: requiring file 'application_helper'
227
+ Jan 03 12:24:23 duo2 rails[4277]: checking 'login_engine' for /Users/topfunky/web/rails/repos/roughunderbelly/config/../vendor/plugins/login_engine/application_helper.rb
228
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'application_helper.rb'
229
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'exception_notifiable.rb'
230
+ Jan 03 12:24:23 duo2 rails[4277]: requiring file 'user_helper'
231
+ Jan 03 12:24:23 duo2 rails[4277]: checking 'login_engine' for /Users/topfunky/web/rails/repos/roughunderbelly/config/../vendor/plugins/login_engine/user_helper.rb
232
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'user_helper.rb'
233
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'user.rb'
234
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'task.rb'
235
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'client.rb'
236
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'email.rb'
237
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'worth.rb'
238
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'column_pref.rb'
239
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'timer.rb'
240
+ Jan 03 12:24:23 duo2 rails[4277]: requiring file '/Users/topfunky/web/rails/repos/roughunderbelly/config/../app/controllers/tasks_controller.rb'
241
+ Jan 03 12:24:23 duo2 rails[4277]: detected RAILS_ROOT, rewriting to 'app/controllers/tasks_controller.rb'
242
+ Jan 03 12:24:23 duo2 rails[4277]: checking 'login_engine' for /Users/topfunky/web/rails/repos/roughunderbelly/config/../vendor/plugins/login_engine/app/controllers/tasks_controller.rb
243
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: '/Users/topfunky/web/rails/repos/roughunderbelly/config/../app/controllers/tasks_controller.rb'
244
+ Jan 03 12:24:23 duo2 rails[4277]: requiring file 'tasks_helper'
245
+ Jan 03 12:24:23 duo2 rails[4277]: checking 'login_engine' for /Users/topfunky/web/rails/repos/roughunderbelly/config/../vendor/plugins/login_engine/tasks_helper.rb
246
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'tasks_helper.rb'
247
+ Jan 03 12:24:23 duo2 rails[4277]: requiring file 'sparklines_helper'
248
+ Jan 03 12:24:23 duo2 rails[4277]: checking 'login_engine' for /Users/topfunky/web/rails/repos/roughunderbelly/config/../vendor/plugins/login_engine/sparklines_helper.rb
249
+ Jan 03 12:24:23 duo2 rails[4277]: finally loading from application: 'sparklines_helper.rb'
250
+ Jan 03 12:24:24 duo2 rails[4277]: SQL (0.000072) BEGIN
251
+ Jan 03 12:24:24 duo2 rails[4277]: SQL (0.000240) INSERT INTO sessions (`updated_at`, `session_id`, `data`) VALUES('2007-01-03 20:24:24', 'bdbb75323d5da69f707d5576e907706e', 'BAh7AA==\n')
252
+ Jan 03 12:24:24 duo2 rails[4277]: SQL (0.000400) COMMIT
253
+ Jan 03 12:24:24 duo2 rails[4277]: Processing TasksController#index (for 127.0.0.1 at 2007-01-03 12:24:24) [GET]
254
+ Jan 03 12:24:24 duo2 rails[4277]: Parameters: {"action"=>"index", "controller"=>"tasks"}
255
+ Jan 03 12:24:24 duo2 rails[4277]: Redirected to http://localhost:3000/tasks/list
256
+ Jan 03 12:24:24 duo2 rails[4277]: Completed in 0.00112 (896 reqs/sec) | DB: 0.00071 (63%) | 302 Found [http://localhost/]
257
+ EOF
258
+
259
+ entries = []
260
+ LogParser.parse(log) { |entry| entries << entry }
261
+
262
+ assert_equal 1, entries.length, "The number of entries was incorrect"
263
+ assert_equal 'TasksController#index', entries.first.page
264
+ assert_equal 0.00112, entries.first.request_time
265
+ end
266
+
267
+ def test_class_parse_multi
268
+ entries = []
269
+ File.open "#{File.dirname(__FILE__)}/test.syslog.log" do |fp|
270
+ LogParser.parse fp do |entry|
271
+ entries << entry
272
+ end
273
+ end
274
+
275
+ assert_equal 13, entries.length
276
+ assert_equal 0.300741, entries.first.request_time
277
+
278
+ redirect = entries[6]
279
+ assert_equal 'TeamsController#progress', redirect.page
280
+ assert_equal 0, redirect.render_time
281
+
282
+ last = entries.last
283
+ assert_equal 'PeopleController#progress', last.page
284
+ assert_equal 0, last.request_time
285
+ end
286
+
287
+ def test_class_parse_0_14_x
288
+ entries = []
289
+ File.open "#{File.dirname(__FILE__)}/test.syslog.0.14.x.log" do |fp|
290
+ LogParser.parse fp do |entry|
291
+ entries << entry
292
+ end
293
+ end
294
+ end
295
+
296
+ end
297
+
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: erkki-production_log_analyzer
3
+ version: !ruby/object:Gem::Version
4
+ version: "2009022401"
5
+ platform: ruby
6
+ authors:
7
+ - Eric Hodel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-02-24 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rails_analyzer_tools
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.4.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: hoe
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.8.3
34
+ version:
35
+ description: production_log_analyzer provides three tools to analyze log files created by SyslogLogger. pl_analyze for getting daily reports, action_grep for pulling log lines for a single action and action_errors to summarize errors with counts.
36
+ email: drbrain@segment7.net
37
+ executables:
38
+ - action_errors
39
+ - action_grep
40
+ - pl_analyze
41
+ extensions: []
42
+
43
+ extra_rdoc_files:
44
+ - History.txt
45
+ - LICENSE.txt
46
+ - Manifest.txt
47
+ - README.txt
48
+ files:
49
+ - History.txt
50
+ - LICENSE.txt
51
+ - Manifest.txt
52
+ - README.txt
53
+ - Rakefile
54
+ - bin/action_errors
55
+ - bin/action_grep
56
+ - bin/pl_analyze
57
+ - lib/production_log/action_grep.rb
58
+ - lib/production_log/analyzer.rb
59
+ - lib/production_log/parser.rb
60
+ - test/test.syslog.0.14.x.log
61
+ - test/test.syslog.1.2.shortname.log
62
+ - test/test.syslog.empty.log
63
+ - test/test.syslog.log
64
+ - test/test_action_grep.rb
65
+ - test/test_analyzer.rb
66
+ - test/test_parser.rb
67
+ has_rdoc: true
68
+ homepage: http://seattlerb.rubyforge.org/production_log_analyzer
69
+ post_install_message:
70
+ rdoc_options:
71
+ - --main
72
+ - README.txt
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ version:
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: "0"
86
+ version:
87
+ requirements: []
88
+
89
+ rubyforge_project: seattlerb
90
+ rubygems_version: 1.2.0
91
+ signing_key:
92
+ specification_version: 2
93
+ summary: production_log_analyzer lets you find out which actions on a Rails site are slowing you down.
94
+ test_files:
95
+ - test/test_action_grep.rb
96
+ - test/test_analyzer.rb
97
+ - test/test_parser.rb