marcopolo 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 273c7f6bc3a4dc54e700b022bf0d079789f23ee2
4
- data.tar.gz: c38e36b80fe9b021019a66e6d47ebdbb80553157
3
+ metadata.gz: afc67f4a1453ec6bb4f6eee5c4416c72f8b9b9e1
4
+ data.tar.gz: f1f2349517951a120298d76dcf9e40b0db217161
5
5
  SHA512:
6
- metadata.gz: bc4bf97a33318d3df0cfcc456048bf8fd262a728a354c53d244febd31b3b87883dc146a92639f1d84b34f4d2736407d20559eddf5aa7510712d985d4efc8228e
7
- data.tar.gz: 42199344fafdb02820dc276bf15f1fe1eb44b064819612690798461595a61de86b3e8ae608dc2fb06c25a97056e45b7c0d801fdaff2d58fd3b9370c1e73f26f7
6
+ metadata.gz: bee378b9d266328c4be7a3a196e0b44b3d3b31c5795caf1674bc1d2862188badfd90267954cf624ee8921a5f04447e71781d5847449c575960edbcfc231eef4c
7
+ data.tar.gz: 61b0b157dafd8cca699c0f49ded943f9087f464e53a9d1764201c793804ad9442062f3d4dddf3c2465f04758d2db0d3fa37be07d87f1b6663e10d32d0ae4db5f
data/README.md CHANGED
@@ -21,14 +21,22 @@ Configure the logger settings in a Rails initializer like so:
21
21
  Marcopolo.options[:logger] = Logger.new(File.join(Rails.root, 'log', "#{Rails.env}-http-raw.log"))
22
22
  Marcopolo.options[:severity] = Logger::Severity::DEBUG
23
23
 
24
- Consider adding logrote rules to your application server to prevent these extremely verbose logs from blowing up your storage.
24
+ Consider adding logrotate rules to your application server to prevent these extremely verbose logs from blowing up your storage.
25
25
 
26
26
  Also, be mindful of cleaning up these logs appropriately, as sensative information like authorization headers and cookies will not be filtered out automatically (hence "raw").
27
27
 
28
+ ### Filtering out noise
29
+
30
+ You may want to filter out noisy requests, such as health checks. Create a proc that takes a [Rack::Request](http://rack.rubyforge.org/doc/classes/Rack/Request.html) object and returns `true` if the request is desirable and `false` if the request should be excluded from the log.
31
+
32
+ Marcopolo.options[:filter] = Proc.new do |request|
33
+ # exclude all options requests
34
+ request.request_method != 'OPTIONS']
35
+ end
36
+
28
37
  ## TODO
29
38
 
30
39
  * Support for Sinatra?
31
- * Noise filters?
32
40
  * Ability to disable for certain endpoints, etc
33
41
  * IP-based log segmenting?
34
42
  * Tests?
data/lib/marcopolo.rb CHANGED
@@ -6,7 +6,8 @@ module Marcopolo
6
6
  DEFAULT_LOGGER = Logger.new($stdout)
7
7
  DEFAULT_OPTIONS = {
8
8
  logger: DEFAULT_LOGGER,
9
- severity: Logger::Severity::DEBUG
9
+ severity: Logger::Severity::DEBUG,
10
+ filter: Proc.new {|request| true }
10
11
  }
11
12
 
12
13
  class << self
@@ -17,5 +18,9 @@ module Marcopolo
17
18
  def log(msg)
18
19
  options[:logger].add(options[:severity]) { msg }
19
20
  end
21
+
22
+ def allow(request)
23
+ options[:filter].call(request)
24
+ end
20
25
  end
21
26
  end
@@ -5,45 +5,59 @@ module Marcopolo
5
5
  end
6
6
 
7
7
  def call(env)
8
- req = Rack::Request.new(env)
8
+ @request = Rack::Request.new(env)
9
9
 
10
+ @status, @headers, @response = @app.call(env)
11
+
12
+ if Marcopolo.allow(@request)
13
+ begin
14
+ rawlog(env)
15
+ rescue => e
16
+ Marcopolo.log "Failed to log request: #{e.message}"
17
+ end
18
+ else
19
+ Marcopolo.log "Filtering request: #{@request.request_method} #{@request.url}"
20
+ end
21
+
22
+ return [@status, @headers, @response]
23
+ end
24
+
25
+ def rawlog(env)
10
26
  req_headers = env.select {|k,v| k.start_with? 'HTTP_'}
11
27
  .collect {|pair| [pair[0].sub(/^HTTP_/, '').split('_').map(&:titleize).join('-'), pair[1]]}
12
28
  .sort
13
29
 
14
30
  req_hash = {
15
31
  "REQUEST" => "",
16
- "Remote Address" => req.ip,
17
- "Request URL" => req.url,
18
- "Request Method" => req.request_method,
32
+ "Remote Address" => @request.ip,
33
+ "Request URL" => @request.url,
34
+ "Request Method" => @request.request_method,
19
35
  "REQUEST HEADERS" => ""
20
36
  }
21
37
 
22
38
  req_headers.to_a.each {|i| req_hash["\t" + i.first] = i.last }
23
39
 
24
40
  req_hash.merge!({
25
- "Request Body" => req.body.gets
41
+ "Request Body" => @request.body.gets
26
42
  })
27
43
 
28
44
  Marcopolo.log req_hash.to_a.map {|o| o.join(': ') }.join("\n") + "\n"
29
45
 
30
- status, headers, response = @app.call(env)
31
-
32
46
  resp_hash = {
33
47
  "RESPONSE" => "",
34
- "Response Status" => response.status,
48
+ "Response Status" => @status,
35
49
  "Response Headers" => ""
36
50
  }
37
51
 
38
- response.headers.to_a.each {|i| resp_hash["\t" + i.first] = i.last }
52
+ @headers.to_a.each {|i| resp_hash["\t" + i.first] = i.last }
53
+
54
+ response_body = @response.respond_to?(:body) ? @response.body : @response
39
55
 
40
56
  resp_hash.merge!({
41
- "Response Body" => response.body
57
+ "Response Body" => response_body
42
58
  })
43
59
 
44
60
  Marcopolo.log resp_hash.to_a.map {|o| o.join(': ') }.join("\n") + "\n"
45
-
46
- return [status, headers, response]
47
61
  end
48
62
  end
49
63
  end
@@ -1,3 +1,3 @@
1
1
  module Marcopolo
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marcopolo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Hammond
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-05 00:00:00.000000000 Z
11
+ date: 2014-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler