rack-traffic-logger 0.2.0 → 0.2.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.
- checksums.yaml +4 -4
- data/README.md +30 -0
- data/lib/rack/traffic_logger/reader.rb +49 -0
- data/lib/rack/traffic_logger/stream_simulator.rb +10 -1
- data/lib/rack/traffic_logger/version.rb +1 -1
- data/lib/rack/traffic_logger.rb +2 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b956c1f090a00f5a1a2a9312a2d75d553110a1a5
|
4
|
+
data.tar.gz: 61e0c4abd72b7273951b6b6a3bcca482b0debea1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a1f32d6b739d39af2375383f659aa3f9efa37a69d47e0c8f6ddb22b2bca5dc355074f2e879590109fd2f035c2aaa7d0e84f35734535e4346514bbfb1dff7d89
|
7
|
+
data.tar.gz: 81552abbaa6f568e6af21cb2e88fb0c98c831b602b54cae47883981d4d6eb2b568977e975ea31dd2af132af1c73a4e84eb9dcd8a1e5bf537e91afd3b4c63110d
|
data/README.md
CHANGED
@@ -133,3 +133,33 @@ If you need to, you can get pretty fancy:
|
|
133
133
|
use Rack::TrafficLogger, 'file.log', :request_headers, 401 => false, 500...600 => :all, 200...300 => {post: :request_bodies, delete: false}
|
134
134
|
use Rack::TrafficLogger, 'file.log', [:get, :head] => 200..204, post: {only: {201 => :request_bodies}}, [:put, :patch] => :all
|
135
135
|
```
|
136
|
+
|
137
|
+
### Tailing a JSON log
|
138
|
+
|
139
|
+
Tailing a JSON log can induce migraines. There are a couple of solutions:
|
140
|
+
|
141
|
+
#### Pipe it through the log parser
|
142
|
+
|
143
|
+
This gem is bundled with the `parse-rack-traffic-log` executable for this exact purpose.
|
144
|
+
|
145
|
+
```bash
|
146
|
+
tail -f traffic.log | parse-rack-traffic-log
|
147
|
+
```
|
148
|
+
|
149
|
+
This will let you tail a JSON log as if it were a regular log. You can add colors and/or JSON pretty printing using environment variables:
|
150
|
+
|
151
|
+
```bash
|
152
|
+
tail -f traffic.log | PRETTY_PRINT=1 COLOR=1 parse-rack-traffic-log
|
153
|
+
```
|
154
|
+
|
155
|
+
I haven't tested this with `less` but it should give the same result.
|
156
|
+
|
157
|
+
#### Use pretty-printing
|
158
|
+
|
159
|
+
You can make the JSON formatter output pretty:
|
160
|
+
|
161
|
+
```ruby
|
162
|
+
use Rack::TrafficLogger, 'file.log', Rack::TrafficLogger::Formatter::JSON.new(pretty_print: true)
|
163
|
+
```
|
164
|
+
|
165
|
+
Note that if you do, log parsers may have a hard time understanding your logs if they expect each event to be on a single line. If you think this could be an issue, use the first method instead.
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'time'
|
3
|
+
|
4
|
+
module Rack
|
5
|
+
class TrafficLogger
|
6
|
+
class Reader
|
7
|
+
|
8
|
+
def self.start(input, output, **options)
|
9
|
+
new input, output, **options
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(input, output, **options)
|
13
|
+
@input = input
|
14
|
+
@output = output
|
15
|
+
@formatter = Formatter::Stream.new(**options)
|
16
|
+
Signal.trap('INT') { exit 0 }
|
17
|
+
loop { readline }
|
18
|
+
end
|
19
|
+
|
20
|
+
# Reads a line from input, formats it, and sends it to output
|
21
|
+
def readline
|
22
|
+
buffer = ''
|
23
|
+
loop do
|
24
|
+
begin
|
25
|
+
buffer << @input.read_nonblock(1)
|
26
|
+
return writeline buffer if buffer[-1] == "\n"
|
27
|
+
rescue IO::EAGAINWaitReadable
|
28
|
+
sleep 0.1
|
29
|
+
rescue EOFError
|
30
|
+
exit 0
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def writeline(line)
|
36
|
+
begin
|
37
|
+
hash = JSON.parse(line)
|
38
|
+
hash[:timestamp] = Time.parse(hash['timestamp'])
|
39
|
+
hash[:request_log_id] = hash['request_log_id']
|
40
|
+
hash[:event] = hash['event']
|
41
|
+
@output << @formatter.format(hash)
|
42
|
+
rescue
|
43
|
+
@output << line
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -48,7 +48,8 @@ module Rack
|
|
48
48
|
result = render RESPONSE_TEMPLATES[@color],
|
49
49
|
http: input['http_version'] || 'HTTP/1.1',
|
50
50
|
code: input['status_code'],
|
51
|
-
status: input['status_name']
|
51
|
+
status: input['status_name'],
|
52
|
+
color: status_color(input['status_code'])
|
52
53
|
headers = input['headers']
|
53
54
|
result << format_headers(headers) if headers
|
54
55
|
result << format_body(input, headers && headers['Content-Type'])
|
@@ -82,6 +83,14 @@ module Rack
|
|
82
83
|
env.select { |k, _| k =~ /^(CONTENT|HTTP)_(?!VERSION)/ }.map { |(k, v)| [k.sub(/^HTTP_/, ''), v] }.to_h
|
83
84
|
end
|
84
85
|
|
86
|
+
def status_color(status)
|
87
|
+
case (status.to_i / 100).to_i
|
88
|
+
when 2 then '32m'
|
89
|
+
when 4, 5 then '31m'
|
90
|
+
else '33m'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
85
94
|
end
|
86
95
|
end
|
87
96
|
end
|
data/lib/rack/traffic_logger.rb
CHANGED
@@ -3,6 +3,7 @@ require_relative 'traffic_logger/header_hash'
|
|
3
3
|
require_relative 'traffic_logger/option_interpreter'
|
4
4
|
require_relative 'traffic_logger/stream_simulator'
|
5
5
|
require_relative 'traffic_logger/formatter'
|
6
|
+
require_relative 'traffic_logger/reader'
|
6
7
|
|
7
8
|
require 'json'
|
8
9
|
require 'securerandom'
|
@@ -44,7 +45,7 @@ module Rack
|
|
44
45
|
if @log_path.respond_to? :write
|
45
46
|
@log_path.write data
|
46
47
|
else
|
47
|
-
File.write @log_path, data, mode: 'a', encoding: data.encoding
|
48
|
+
::File.write @log_path, data, mode: 'a', encoding: data.encoding
|
48
49
|
end
|
49
50
|
end
|
50
51
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-traffic-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neil E. Pearson
|
@@ -40,6 +40,7 @@ files:
|
|
40
40
|
- lib/rack/traffic_logger/formatter/stream.rb
|
41
41
|
- lib/rack/traffic_logger/header_hash.rb
|
42
42
|
- lib/rack/traffic_logger/option_interpreter.rb
|
43
|
+
- lib/rack/traffic_logger/reader.rb
|
43
44
|
- lib/rack/traffic_logger/stream_simulator.rb
|
44
45
|
- lib/rack/traffic_logger/version.rb
|
45
46
|
homepage: https://github.com/hx/rack-traffic-logger
|