http_log 0.0.1
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/MIT-LICENSE +20 -0
- data/Rakefile +38 -0
- data/app/assets/javascripts/http_log.js +14 -0
- data/app/assets/stylesheets/http_log.css +12 -0
- data/app/controllers/http_log/requests_controller.rb +10 -0
- data/app/models/http_log/request.rb +35 -0
- data/app/views/http_log/requests/show.html.erb +59 -0
- data/app/views/layouts/http_log/requests.html.erb +30 -0
- data/config/routes.rb +3 -0
- data/lib/http_log/http_request.rb +30 -0
- data/lib/http_log/middleware.rb +40 -0
- data/lib/http_log/railtie.rb +37 -0
- data/lib/http_log/version.rb +3 -0
- data/lib/http_log.rb +23 -0
- data/lib/tasks/http_logger_tasks.rake +4 -0
- data/readme.md +106 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/images/image.jpg +0 -0
- data/test/dummy/app/assets/javascripts/application.js +14 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +2 -0
- data/test/dummy/app/controllers/echo_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config/application.rb +62 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +31 -0
- data/test/dummy/config/environments/production.rb +64 -0
- data/test/dummy/config/environments/test.rb +35 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +10 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/mongoid.yml +7 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/log/test.log +8567 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/tmp/cache/assets/C56/AF0/sprockets%2F8bd6bc711946e979052328c24a265273 +2491 -0
- data/test/dummy/tmp/cache/assets/C88/730/sprockets%2F5b9d71c4883306a9e7425d3149785b0a +0 -0
- data/test/dummy/tmp/cache/assets/CAC/FC0/sprockets%2F143f0911dfc3cc1692f4d429654d7422 +0 -0
- data/test/dummy/tmp/cache/assets/CBD/000/sprockets%2F9d2bd18b820d1d20830ad0411e05a317 +0 -0
- data/test/dummy/tmp/cache/assets/CD7/500/sprockets%2Fae345f99053c3b580c5421a1a8a9b509 +0 -0
- data/test/dummy/tmp/cache/assets/CD7/9B0/sprockets%2Fef051dd1922500356c22d85b54b94ef4 +0 -0
- data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/CD8/EB0/sprockets%2Ff6249465d0ba565203e326e971ba33dc +0 -0
- data/test/dummy/tmp/cache/assets/D00/890/sprockets%2F641813db3a41029a3f60b1ef90e95eb2 +0 -0
- data/test/dummy/tmp/cache/assets/D05/B40/sprockets%2F6ec40b73403c5c791c98c130a66f03eb +0 -0
- data/test/dummy/tmp/cache/assets/D14/B90/sprockets%2F22c02508890f4a42d489f5cb9995bcaa +0 -0
- data/test/dummy/tmp/cache/assets/D18/BC0/sprockets%2Fcc96a74afecc950f9b1923750a624666 +0 -0
- data/test/dummy/tmp/cache/assets/D1C/3F0/sprockets%2Ff3cb97c67a28f035a79bf35393a493b6 +0 -0
- data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/D39/6B0/sprockets%2F8d0238243bc83309bfffe73733edb00d +0 -0
- data/test/dummy/tmp/cache/assets/D3E/820/sprockets%2F6260e7992ddc6fc2380ba3b8c032dd94 +0 -0
- data/test/dummy/tmp/cache/assets/D47/EC0/sprockets%2Fdc5e701826b1ce3f37c1c89bf75f2538 +0 -0
- data/test/dummy/tmp/cache/assets/D4A/E60/sprockets%2Fbfb99140fe3d1ff718034c6a8e18847d +0 -0
- data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/D54/ED0/sprockets%2F71c9fa01091d432b131da3bb73faf3d4 +2496 -0
- data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/D5B/D40/sprockets%2F04e9e640af4cc213ef17ba39d31f2a40 +0 -0
- data/test/dummy/tmp/cache/assets/D60/660/sprockets%2F180c4ea684d2eadbbd5e85d302601b74 +0 -0
- data/test/dummy/tmp/cache/assets/D80/D90/sprockets%2Fe73320ffabc376681cd17ed79d9b93e7 +0 -0
- data/test/dummy/tmp/cache/assets/D84/4B0/sprockets%2F6a24f73a9cc3c9f978a16a79afe6818b +0 -0
- data/test/dummy/tmp/cache/assets/D8D/D50/sprockets%2Fd4f3b2c5183658aa13fa2d8511e6bcba +0 -0
- data/test/dummy/tmp/cache/assets/DB9/CD0/sprockets%2F58dda55967442f12eac66cfe9ef69bf6 +0 -0
- data/test/dummy/tmp/cache/assets/DC1/380/sprockets%2Fc4cf1e25b6a6e86e6cb37dd2413fbb00 +0 -0
- data/test/dummy/tmp/cache/assets/DC4/7C0/sprockets%2Fcba25fb6f81b385a80ef50f3405b2ded +0 -0
- data/test/dummy/tmp/cache/assets/DC7/430/sprockets%2F3a58abcdb48a00fb9f180e8ddf3e9203 +0 -0
- data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/test/dummy/tmp/cache/assets/DF5/D50/sprockets%2F5ad27ea47264a1fb2bafb977f50d2fca +0 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/test/dummy/tmp/cache/assets/E07/410/sprockets%2F490f1cfa897fcbe947b0ff03ec38dfb1 +0 -0
- data/test/dummy/tmp/cache/assets/E0C/3A0/sprockets%2Fef495ecd04bb6d988d0865ebbebf3c63 +0 -0
- data/test/dummy/tmp/cache/assets/E0D/320/sprockets%2Fbf429fbc894ba0b9e4e65fd9825c1fbe +0 -0
- data/test/dummy/tmp/cache/assets/E23/000/sprockets%2Fa2e82546ad8185cbdbbcc6b7fa33db3c +0 -0
- data/test/dummy/tmp/cache/assets/E54/5F0/sprockets%2Fffb07dbaf19b3044d2fb165c1eefaf9a +0 -0
- data/test/integration/filters_test.rb +37 -0
- data/test/integration/logging_test.rb +144 -0
- data/test/integration/response_test.rb +11 -0
- data/test/integration/retrieve_request_test.rb +13 -0
- data/test/support/database_cleaner.rb +17 -0
- data/test/support/http_logger.rb +7 -0
- data/test/test_helper.rb +10 -0
- metadata +274 -0
data/MIT-LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
Copyright 2012 YOURNAME
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
4
|
+
a copy of this software and associated documentation files (the
|
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
9
|
+
the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be
|
|
12
|
+
included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env rake
|
|
2
|
+
begin
|
|
3
|
+
require 'bundler/setup'
|
|
4
|
+
rescue LoadError
|
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
|
6
|
+
end
|
|
7
|
+
begin
|
|
8
|
+
require 'rdoc/task'
|
|
9
|
+
rescue LoadError
|
|
10
|
+
require 'rdoc/rdoc'
|
|
11
|
+
require 'rake/rdoctask'
|
|
12
|
+
RDoc::Task = Rake::RDocTask
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
|
17
|
+
rdoc.title = 'HttpLog'
|
|
18
|
+
rdoc.options << '--line-numbers'
|
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
|
24
|
+
load 'rails/tasks/engine.rake'
|
|
25
|
+
|
|
26
|
+
Bundler::GemHelper.install_tasks
|
|
27
|
+
|
|
28
|
+
require 'rake/testtask'
|
|
29
|
+
|
|
30
|
+
Rake::TestTask.new(:test) do |t|
|
|
31
|
+
t.libs << 'lib'
|
|
32
|
+
t.libs << 'test'
|
|
33
|
+
t.pattern = 'test/**/*_test.rb'
|
|
34
|
+
t.verbose = false
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
task :default => :test
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// This is a manifest file that'll be compiled into including all the files listed below.
|
|
2
|
+
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
|
|
3
|
+
// be included in the compiled file accessible from http://example.com/assets/application.js
|
|
4
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
|
5
|
+
// the compiled file.
|
|
6
|
+
//
|
|
7
|
+
//= require jquery
|
|
8
|
+
//= require jquery_ujs
|
|
9
|
+
//= require twitter/bootstrap
|
|
10
|
+
//= require_tree .
|
|
11
|
+
|
|
12
|
+
$(function() {
|
|
13
|
+
$("body#http-logger > .topbar").scrollSpy()
|
|
14
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* This is a manifest file that'll automatically include all the stylesheets available in this directory
|
|
3
|
+
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
|
|
4
|
+
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
|
5
|
+
*= require_self
|
|
6
|
+
*= require twitter/bootstrap
|
|
7
|
+
*= require_tree .
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#http-logger table {
|
|
11
|
+
table-layout: fixed;
|
|
12
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module HttpLog
|
|
2
|
+
class Request
|
|
3
|
+
include Mongoid::Document
|
|
4
|
+
include Mongoid::Timestamps
|
|
5
|
+
|
|
6
|
+
field :http_method, :type => String
|
|
7
|
+
field :url, :type => String
|
|
8
|
+
field :raw_post, :type => String
|
|
9
|
+
field :remote_ip, :type => String
|
|
10
|
+
field :remote_host, :type => String
|
|
11
|
+
field :user_agent, :type => String
|
|
12
|
+
field :content_type, :type => String
|
|
13
|
+
field :headers, :type => Hash, :default => {}
|
|
14
|
+
field :params, :type => Hash, :default => {}
|
|
15
|
+
field :cookies, :type => Hash, :default => {}
|
|
16
|
+
|
|
17
|
+
def self.from_request(rack)
|
|
18
|
+
new do |req|
|
|
19
|
+
req.http_method = rack.request_method
|
|
20
|
+
req.url = rack.url
|
|
21
|
+
req.headers = rack.header_hash
|
|
22
|
+
req.params = rack.params
|
|
23
|
+
req.user_agent = rack.user_agent
|
|
24
|
+
req.content_type = rack.content_type
|
|
25
|
+
req.raw_post = rack.raw_post
|
|
26
|
+
req.remote_ip = rack.ip
|
|
27
|
+
req.cookies = rack.cookies
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def accept
|
|
32
|
+
headers['HTTP_ACCEPT'].present? ? headers['HTTP_ACCEPT'] : nil
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<h1>HTTP Request: <%= @log.id %></h1>
|
|
2
|
+
|
|
3
|
+
<table id="summary" class="bordered-table zebra-striped">
|
|
4
|
+
<tbody>
|
|
5
|
+
<tr>
|
|
6
|
+
<th>URL</th>
|
|
7
|
+
<td><%= @log.url %></td>
|
|
8
|
+
</tr>
|
|
9
|
+
<tr>
|
|
10
|
+
<th>Method</th>
|
|
11
|
+
<td><%= @log.http_method.upcase %></td>
|
|
12
|
+
</tr>
|
|
13
|
+
<tr>
|
|
14
|
+
<th>Received</th>
|
|
15
|
+
<td><%= @log.created_at %></td>
|
|
16
|
+
</tr>
|
|
17
|
+
<tr>
|
|
18
|
+
<th>From</th>
|
|
19
|
+
<td><%= @log.remote_ip %></td>
|
|
20
|
+
</tr>
|
|
21
|
+
<tr>
|
|
22
|
+
<th>User Agent</th>
|
|
23
|
+
<td><%= @log.user_agent %></td>
|
|
24
|
+
</tr>
|
|
25
|
+
<tr id="content-type">
|
|
26
|
+
<th>Content-Type</th>
|
|
27
|
+
<td><%= @log.content_type %></td>
|
|
28
|
+
</tr>
|
|
29
|
+
<tr id="accepts">
|
|
30
|
+
<th>Accept</th>
|
|
31
|
+
<td><%= @log.accept %></td>
|
|
32
|
+
</tr>
|
|
33
|
+
</tbody>
|
|
34
|
+
</table>
|
|
35
|
+
|
|
36
|
+
<h2>Parameters</h2>
|
|
37
|
+
<pre id="parameters" class="pretty-print">
|
|
38
|
+
<%= @log.params.inspect %>
|
|
39
|
+
</pre>
|
|
40
|
+
|
|
41
|
+
<h2>Headers</h2>
|
|
42
|
+
<table id="headers" class="bordered-table zebra-striped">
|
|
43
|
+
<% @log.headers.each do |name, value| %>
|
|
44
|
+
<tr>
|
|
45
|
+
<th><%= name %></th>
|
|
46
|
+
<td><%= value %></th>
|
|
47
|
+
</tr>
|
|
48
|
+
<% end %>
|
|
49
|
+
</table>
|
|
50
|
+
|
|
51
|
+
<h2>Raw Post</h2>
|
|
52
|
+
<pre id="raw-post" class="pretty-print">
|
|
53
|
+
<%= @log.raw_post %>
|
|
54
|
+
</pre>
|
|
55
|
+
|
|
56
|
+
<h2>Cookies</h2>
|
|
57
|
+
<pre id="cookies" class="pretty-print">
|
|
58
|
+
<%= @log.cookies %>
|
|
59
|
+
</pre>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>HTTP Logger</title>
|
|
5
|
+
<%= stylesheet_link_tag "application" %>
|
|
6
|
+
<%= javascript_include_tag "application" %>
|
|
7
|
+
<%= csrf_meta_tags %>
|
|
8
|
+
</head>
|
|
9
|
+
<body id="http-logger" style="padding-top: 60px">
|
|
10
|
+
<div class="topbar" data-scrollspy="scrollspy">
|
|
11
|
+
<div class="topbar-inner">
|
|
12
|
+
<div class="container">
|
|
13
|
+
<h3 class="brand">HTTP Log</h3>
|
|
14
|
+
<ul class="nav">
|
|
15
|
+
<li><%= link_to "Summary", "#summary" %></li>
|
|
16
|
+
<li><%= link_to "Content-Type", "#content-type" %></li>
|
|
17
|
+
<li><%= link_to "Accepts", "#accepts" %></li>
|
|
18
|
+
<li><%= link_to "Paramters", "#parameters" %></li>
|
|
19
|
+
<li><%= link_to "Headers", "#headers" %></li>
|
|
20
|
+
<li><%= link_to "Raw Post", "#raw-post" %></li>
|
|
21
|
+
<li><%= link_to "Cookies ", "#cookies" %></li>
|
|
22
|
+
</ul>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="container">
|
|
27
|
+
<%= yield %>
|
|
28
|
+
</div>
|
|
29
|
+
</body>
|
|
30
|
+
</html>
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module HttpLog
|
|
2
|
+
class HttpRequest < Rack::Request
|
|
3
|
+
def accepts
|
|
4
|
+
Array.wrap(super).map(&:to_s)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def header_hash
|
|
8
|
+
header_keys = env.keys.select {|k| k =~ /HTTP_\w+/ }
|
|
9
|
+
hash = {}
|
|
10
|
+
header_keys.each do |key|
|
|
11
|
+
hash[key] = env[key]
|
|
12
|
+
end
|
|
13
|
+
hash
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def accepts
|
|
17
|
+
env['HTTP_ACCEPT']
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def raw_post
|
|
21
|
+
content = env['rack.input'].read
|
|
22
|
+
env['rack.input'].rewind
|
|
23
|
+
content
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def params
|
|
27
|
+
super.merge(env['action_dispatch.request.request_parameters'] || {})
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module HttpLog
|
|
2
|
+
class Middleware
|
|
3
|
+
def initialize(app)
|
|
4
|
+
@app = app
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def call(env)
|
|
8
|
+
@proxy = HttpRequest.new(env)
|
|
9
|
+
if passes_filters?
|
|
10
|
+
request = HttpLog::Request.from_request(@proxy)
|
|
11
|
+
|
|
12
|
+
HttpLog.callbacks.each do |callback|
|
|
13
|
+
callback.call @proxy, request
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
request.save
|
|
17
|
+
env['http_log.request_id'] = request.id.to_s
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
@app.call env
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def passes_filters?
|
|
24
|
+
HttpLog.filters.each do |filter|
|
|
25
|
+
matches_filter = if filter.is_a? Symbol
|
|
26
|
+
@proxy.path_info =~ /\.#{filter}$/
|
|
27
|
+
elsif filter.is_a? Regexp
|
|
28
|
+
@proxy.url =~ filter
|
|
29
|
+
else
|
|
30
|
+
filter.call @proxy
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
return false if matches_filter
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
true
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module HttpLog
|
|
2
|
+
module ControllerHelpers
|
|
3
|
+
extend ActiveSupport::Concern
|
|
4
|
+
|
|
5
|
+
included do
|
|
6
|
+
before_filter :include_http_request_log_id, :if => :http_log_request_id
|
|
7
|
+
|
|
8
|
+
def include_http_request_log_id
|
|
9
|
+
logger.info " HTTP Logger Request ID: #{http_log_request_id}"
|
|
10
|
+
headers['X-Request-Log-ID'] = http_log_request_id
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def http_log_request_id
|
|
14
|
+
request.env['http_log.request_id']
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class Engine < ::Rails::Engine
|
|
20
|
+
isolate_namespace HttpLog
|
|
21
|
+
|
|
22
|
+
initializer "http_log.middlware" do |app|
|
|
23
|
+
app.middleware.use HttpLog::Middleware
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
initializer "http_log.filters" do |app|
|
|
27
|
+
regexp = /assets/
|
|
28
|
+
HttpLog.filters << regexp
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
initializer "http_log.action_controller" do
|
|
32
|
+
ActiveSupport.on_load(:action_controller) do
|
|
33
|
+
ActionController::Base.send :include, HttpLog::ControllerHelpers
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
data/lib/http_log.rb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'mongoid'
|
|
2
|
+
require 'http_log/http_request'
|
|
3
|
+
require 'http_log/middleware'
|
|
4
|
+
require 'twitter-bootstrap-rails'
|
|
5
|
+
require "http_log/railtie"
|
|
6
|
+
|
|
7
|
+
module HttpLog
|
|
8
|
+
def self.with_request(&block)
|
|
9
|
+
callbacks << block
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.callbacks
|
|
13
|
+
@callbacks ||= []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.filters
|
|
17
|
+
@filters ||= []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.filter(&block)
|
|
21
|
+
filters << block
|
|
22
|
+
end
|
|
23
|
+
end
|
data/readme.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# HTTP Log
|
|
2
|
+
|
|
3
|
+
Logs all requests made to your application in a search format to
|
|
4
|
+
MongoDB. This gem includes a middleware to log rack requests to MongodB.
|
|
5
|
+
It also adds a header to every response indicating an `id` that can be
|
|
6
|
+
used to retrieve that request. You can combine this header and the one's
|
|
7
|
+
added by rails to track the conversation applications are having with
|
|
8
|
+
your application.
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
This gem using Mongoid to store the models. Once you install the gem,
|
|
13
|
+
run the mongoid config generator to setup the connection.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
gem 'http_log'
|
|
17
|
+
|
|
18
|
+
bundle install
|
|
19
|
+
|
|
20
|
+
bundle exec rails g mongoid:config # if you don't already have one
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Example of What is Logged
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
{
|
|
27
|
+
"_id":"4f16c6c4340765d7c5000005",
|
|
28
|
+
"url":"http://www.example.com/",
|
|
29
|
+
"http_method":"POST",
|
|
30
|
+
"accept":["text/html","application/xml","image/png","text/plain","*/*"],
|
|
31
|
+
"content_type":"application/json",
|
|
32
|
+
"raw_post":"{\"foo\": \"bar\"}",
|
|
33
|
+
"params":{
|
|
34
|
+
"foo":"bar"
|
|
35
|
+
},
|
|
36
|
+
"headers":{
|
|
37
|
+
"HTTP_HOST":"www.example.com",
|
|
38
|
+
"HTTP_ACCEPT":"text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5",
|
|
39
|
+
"HTTP_COOKIE":""
|
|
40
|
+
},
|
|
41
|
+
"created_at":"2012-01-18T15:19:00+02:00",
|
|
42
|
+
"updated_at":"2012-01-18T15:19:00+02:00"
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Filtering
|
|
47
|
+
|
|
48
|
+
You may also filter out specific requests. Requests to `/assets` are
|
|
49
|
+
filters by **default**. You can filter requests using three different
|
|
50
|
+
methods:
|
|
51
|
+
|
|
52
|
+
1. Symbols (treated as file extensions)
|
|
53
|
+
2. Regex (matched aganist the full URL)
|
|
54
|
+
3. Blocks/Procs/Lambda/Things that `respond_to? :call`
|
|
55
|
+
|
|
56
|
+
Filters are used to exclude requests. So, if a filter returns true then
|
|
57
|
+
that request will **not** be logged.
|
|
58
|
+
|
|
59
|
+
Here are some examples.
|
|
60
|
+
|
|
61
|
+
```ruby
|
|
62
|
+
# Using Symbols
|
|
63
|
+
HttpLog.filters << :jpg
|
|
64
|
+
|
|
65
|
+
# Using Regex
|
|
66
|
+
HttpLog.filters << /private/
|
|
67
|
+
|
|
68
|
+
# Using Blocks/Procs/Lambdas/Things that resond_to? :call
|
|
69
|
+
# req is ActionDispatch::Request with some sugar
|
|
70
|
+
HttpLog.filter do |req|
|
|
71
|
+
req.env # perhaps access the rack request stuff
|
|
72
|
+
true if my_conditions_are_met
|
|
73
|
+
end
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Adding More Log Information
|
|
77
|
+
|
|
78
|
+
You can add has many callbacks as you'd like. They are executed inside
|
|
79
|
+
the middleware after the initial log is instantiated. Callbacks are ran,
|
|
80
|
+
then the log is persisted.
|
|
81
|
+
|
|
82
|
+
Let's say you want to add some more headers of your own:
|
|
83
|
+
|
|
84
|
+
```ruby
|
|
85
|
+
# config/initializers/http_log.rb
|
|
86
|
+
# req is an ActionDispatch::Request
|
|
87
|
+
# log is the HttpLog::Request instance
|
|
88
|
+
|
|
89
|
+
HttpLog.with_request |log, req|
|
|
90
|
+
log.headers['Custom-Foo'] = 'bar'
|
|
91
|
+
end
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
You may also add your own fields by reopneing the class and using the
|
|
95
|
+
Mongoid APi.
|
|
96
|
+
|
|
97
|
+
```ruby
|
|
98
|
+
# config/initializers/http_log.rb
|
|
99
|
+
class HttpLog::Request
|
|
100
|
+
field :developer_api_key, :type => String
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
HttpLog.with_request |log, req|
|
|
104
|
+
log.developer_api_key = req.parameters['developer_api_key']
|
|
105
|
+
end
|
|
106
|
+
```
|