loga 2.5.3 → 2.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/gemfiles/rails60.gemfile +1 -1
- data/gemfiles/sidekiq51.gemfile +1 -1
- data/gemfiles/sidekiq6.gemfile +1 -1
- data/gemfiles/sinatra14.gemfile +1 -1
- data/gemfiles/unit.gemfile +1 -1
- data/lib/loga/rack/logger.rb +31 -44
- data/lib/loga/version.rb +1 -1
- data/spec/integration/sinatra_spec.rb +1 -1
- data/spec/unit/loga/rack/logger_spec.rb +56 -36
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0e5af261daf89f7f7e4b80be296a8f19307a33f187a501e23eb5295fbedd8f2
|
4
|
+
data.tar.gz: ed0d0281f4d40078051363434600bdd9a8f843ba70a85fde3b110d56a58e2ca3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64128d6a8442ce7006629f3056c94487e9316f7c07cd284b3f96f3bb01fd5daccd3a7e4372dfb746376e8e91e2ccb52e015e381bd1c2fdc1774b86e5a5a78f43
|
7
|
+
data.tar.gz: bf0393ec37a4f9f8a023d031b5823ad94151fc98b9f1d2ce1ee2bea8b580c88db3013b35b73c68636dfb482dbabd1019771b0b0542ec11c8b2ab0baad290a022
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
|
+
## [2.5.4] - 2021-03-24
|
8
|
+
### Fixed
|
9
|
+
- Remove state from Rack middleware, to prevent race conditions where one request would overwrite the state of another
|
10
|
+
|
7
11
|
## [2.5.3] - 2020-10-27
|
8
12
|
### Fixed
|
9
13
|
- Support for sidekiq 6 - previous versions were causing sidekiq to crash with `Internal exception!`
|
data/gemfiles/rails60.gemfile
CHANGED
data/gemfiles/sidekiq51.gemfile
CHANGED
data/gemfiles/sidekiq6.gemfile
CHANGED
data/gemfiles/sinatra14.gemfile
CHANGED
data/gemfiles/unit.gemfile
CHANGED
data/lib/loga/rack/logger.rb
CHANGED
@@ -7,65 +7,57 @@ module Loga
|
|
7
7
|
@app = app
|
8
8
|
end
|
9
9
|
|
10
|
-
def call(env)
|
10
|
+
def call(env, started_at = Time.now)
|
11
11
|
request = Loga::Rack::Request.new(env)
|
12
12
|
env['loga.request.original_path'] = request.path
|
13
13
|
|
14
14
|
if logger.respond_to?(:tagged)
|
15
|
-
logger.tagged(compute_tags(request)) { call_app(request, env) }
|
15
|
+
logger.tagged(compute_tags(request)) { call_app(request, env, started_at) }
|
16
16
|
else
|
17
|
-
call_app(request, env)
|
17
|
+
call_app(request, env, started_at)
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
private
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
def call_app(request, env)
|
26
|
-
@data = {}
|
27
|
-
@env = env
|
28
|
-
@request = request
|
29
|
-
@started_at = Time.now
|
30
|
-
|
31
|
-
@app.call(env).tap { |status, _headers, _body| data['status'] = status.to_i }
|
23
|
+
def call_app(request, env, started_at)
|
24
|
+
status, _headers, _body = @app.call(env)
|
32
25
|
ensure
|
33
|
-
|
34
|
-
send_message
|
35
|
-
end
|
26
|
+
data = generate_data(request, status, started_at)
|
36
27
|
|
37
|
-
|
38
|
-
def set_data
|
39
|
-
data['method'] = request.request_method
|
40
|
-
data['path'] = request.original_path
|
41
|
-
data['params'] = request.filtered_parameters
|
42
|
-
data['request_id'] = request.uuid
|
43
|
-
data['request_ip'] = request.ip
|
44
|
-
data['user_agent'] = request.user_agent
|
45
|
-
data['controller'] = request.controller_action_name if request.controller_action_name
|
46
|
-
data['duration'] = duration_in_ms(started_at, Time.now)
|
47
|
-
|
48
|
-
# If data['status'] is nil we assume an exception was raised when calling the application
|
49
|
-
data['status'] ||= 500
|
50
|
-
end
|
51
|
-
# rubocop:enable Metrics/LineLength
|
28
|
+
exception = compute_exception(env)
|
52
29
|
|
53
|
-
def send_message
|
54
30
|
event = Loga::Event.new(
|
55
31
|
data: { request: data },
|
56
|
-
exception:
|
57
|
-
message: compute_message,
|
32
|
+
exception: exception,
|
33
|
+
message: compute_message(request, data),
|
58
34
|
timestamp: started_at,
|
59
35
|
type: 'request',
|
60
36
|
)
|
61
|
-
|
37
|
+
|
38
|
+
exception ? logger.error(event) : logger.info(event)
|
39
|
+
end
|
40
|
+
|
41
|
+
def generate_data(request, status, started_at)
|
42
|
+
controller = request.controller_action_name
|
43
|
+
status ||= 500
|
44
|
+
{
|
45
|
+
'method' => request.request_method,
|
46
|
+
'path' => request.original_path,
|
47
|
+
'params' => request.filtered_parameters,
|
48
|
+
'request_id' => request.uuid,
|
49
|
+
'request_ip' => request.ip,
|
50
|
+
'user_agent' => request.user_agent,
|
51
|
+
'duration' => duration_in_ms(started_at, Time.now),
|
52
|
+
'status' => status.to_i,
|
53
|
+
}.tap { |d| d['controller'] = controller if controller }
|
62
54
|
end
|
63
55
|
|
64
56
|
def logger
|
65
57
|
Loga.logger
|
66
58
|
end
|
67
59
|
|
68
|
-
def compute_message
|
60
|
+
def compute_message(request, data)
|
69
61
|
'%<method>s %<filtered_full_path>s %<status>d in %<duration>dms' % {
|
70
62
|
method: request.request_method,
|
71
63
|
filtered_full_path: request.filtered_full_path,
|
@@ -74,19 +66,14 @@ module Loga
|
|
74
66
|
}
|
75
67
|
end
|
76
68
|
|
77
|
-
def
|
78
|
-
|
79
|
-
|
69
|
+
def compute_exception(env)
|
70
|
+
exception =
|
71
|
+
env['loga.exception'] || env['action_dispatch.exception'] ||
|
72
|
+
env['sinatra.error'] || env['rack.exception']
|
80
73
|
|
81
|
-
def compute_exception
|
82
74
|
filter_exceptions.include?(exception.class.to_s) ? nil : exception
|
83
75
|
end
|
84
76
|
|
85
|
-
def exception
|
86
|
-
env['loga.exception'] || env['action_dispatch.exception'] ||
|
87
|
-
env['sinatra.error'] || env['rack.exception']
|
88
|
-
end
|
89
|
-
|
90
77
|
def filter_exceptions
|
91
78
|
Loga.configuration.filter_exceptions
|
92
79
|
end
|
data/lib/loga/version.rb
CHANGED
@@ -68,7 +68,6 @@ RSpec.describe 'Structured logging with Sinatra', :with_hostname, :timecop do
|
|
68
68
|
end
|
69
69
|
let(:data) do
|
70
70
|
{
|
71
|
-
'status' => 200,
|
72
71
|
'method' => 'GET',
|
73
72
|
'path' => '/ok',
|
74
73
|
'params' => { 'username'=>'yoshi' },
|
@@ -76,6 +75,7 @@ RSpec.describe 'Structured logging with Sinatra', :with_hostname, :timecop do
|
|
76
75
|
'request_ip' => '127.0.0.1',
|
77
76
|
'user_agent' => nil,
|
78
77
|
'duration' => 0,
|
78
|
+
'status' => 200,
|
79
79
|
}
|
80
80
|
end
|
81
81
|
let(:data_as_text) { "data=#{{ request: data }.inspect}" }
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'rack/test'
|
3
3
|
|
4
|
-
# rubocop:disable RSpec/
|
4
|
+
# rubocop:disable RSpec/VerifiedDoubles RSpec/MessageSpies
|
5
5
|
describe Loga::Rack::Logger do
|
6
|
-
subject { described_class.new(app) }
|
6
|
+
subject(:middleware) { described_class.new(app) }
|
7
7
|
|
8
8
|
let(:env) { Rack::MockRequest.env_for('/about_us?limit=1', options) }
|
9
9
|
let(:options) { {} }
|
@@ -21,18 +21,25 @@ describe Loga::Rack::Logger do
|
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
let(:started_at) { Time.new(2021, 1, 2, 9, 30, 4.500, '+00:00') }
|
25
|
+
|
26
|
+
around do |example|
|
27
|
+
Timecop.freeze(Time.new(2021, 1, 2, 9, 30, 5.000, '+00:00'), &example)
|
28
|
+
end
|
29
|
+
|
30
|
+
before do
|
31
|
+
allow(Loga).to receive(:configuration).and_return(configuration)
|
32
|
+
end
|
25
33
|
|
26
34
|
shared_examples 'logs the event' do |details|
|
27
35
|
let(:level) { details[:level] }
|
28
36
|
|
29
|
-
before do
|
30
|
-
allow(subject).to receive(:started_at).and_return(:timestamp)
|
31
|
-
allow(subject).to receive(:duration_in_ms).with(any_args).and_return(5)
|
32
|
-
end
|
33
|
-
|
34
37
|
it 'instantiates a Loga::Event' do
|
35
|
-
|
38
|
+
allow(Loga::Event).to receive(:new).and_call_original
|
39
|
+
|
40
|
+
middleware.call(env, started_at)
|
41
|
+
|
42
|
+
expect(Loga::Event).to have_received(:new).with(
|
36
43
|
data: {
|
37
44
|
request: {
|
38
45
|
'status' => response_status,
|
@@ -42,21 +49,19 @@ describe Loga::Rack::Logger do
|
|
42
49
|
'request_id' => nil,
|
43
50
|
'request_ip' => nil,
|
44
51
|
'user_agent' => nil,
|
45
|
-
'duration' =>
|
52
|
+
'duration' => 500,
|
46
53
|
},
|
47
54
|
},
|
48
55
|
exception: logged_exception,
|
49
56
|
message: %r{^GET \/about_us\?limit=1 #{response_status} in \d+ms$},
|
50
|
-
timestamp:
|
57
|
+
timestamp: started_at,
|
51
58
|
type: 'request',
|
52
59
|
)
|
53
|
-
|
54
|
-
subject.call(env)
|
55
60
|
end
|
56
61
|
|
57
62
|
it "logs the Loga::Event with severity #{details[:level]}" do
|
58
63
|
allow(logger).to receive(level)
|
59
|
-
|
64
|
+
middleware.call(env, started_at)
|
60
65
|
expect(logger).to have_received(level).with(an_instance_of(Loga::Event))
|
61
66
|
end
|
62
67
|
end
|
@@ -69,9 +74,31 @@ describe Loga::Rack::Logger do
|
|
69
74
|
|
70
75
|
context 'when an exception is raised' do
|
71
76
|
let(:app) { ->(_env) { raise exception_class } }
|
72
|
-
|
73
|
-
|
74
|
-
|
77
|
+
let(:response_status) { 500 }
|
78
|
+
|
79
|
+
it 'raises error, but still logs an event' do
|
80
|
+
allow(Loga::Event).to receive(:new).and_call_original
|
81
|
+
|
82
|
+
expect { middleware.call(env, started_at) }.to raise_error(exception_class)
|
83
|
+
|
84
|
+
expect(Loga::Event).to have_received(:new).with(
|
85
|
+
data: {
|
86
|
+
request: {
|
87
|
+
'status' => response_status,
|
88
|
+
'method' => 'GET',
|
89
|
+
'path' => '/about_us',
|
90
|
+
'params' => { 'limit' => '1' },
|
91
|
+
'request_id' => nil,
|
92
|
+
'request_ip' => nil,
|
93
|
+
'user_agent' => nil,
|
94
|
+
'duration' => 500,
|
95
|
+
},
|
96
|
+
},
|
97
|
+
exception: logged_exception,
|
98
|
+
message: %r{^GET \/about_us\?limit=1 #{response_status} in \d+ms$},
|
99
|
+
timestamp: started_at,
|
100
|
+
type: 'request',
|
101
|
+
)
|
75
102
|
end
|
76
103
|
end
|
77
104
|
|
@@ -113,28 +140,21 @@ describe Loga::Rack::Logger do
|
|
113
140
|
end
|
114
141
|
|
115
142
|
context 'when the logger is tagged' do
|
116
|
-
let(:logger) {
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
block.call
|
123
|
-
end
|
124
|
-
end
|
143
|
+
let(:logger) { Loga::TaggedLogging.new(Logger.new('/dev/null')) }
|
144
|
+
let(:fake_tag_proc) { double(:proc, call: true) }
|
145
|
+
|
146
|
+
let(:tags) { [->(request) { fake_tag_proc.call(request) }] }
|
147
|
+
|
148
|
+
include_examples 'logs the event', level: :info
|
125
149
|
|
126
|
-
|
127
|
-
|
150
|
+
it 'calls the tags and computes them' do
|
151
|
+
middleware.call(env)
|
128
152
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
expect(logger).to have_received(:tagged).with(:tag) do |&block|
|
133
|
-
expect(block.call).to eq(:response)
|
134
|
-
end
|
135
|
-
end
|
153
|
+
expect(fake_tag_proc)
|
154
|
+
.to have_received(:call)
|
155
|
+
.with(instance_of(Loga::Rack::Request))
|
136
156
|
end
|
137
157
|
end
|
138
158
|
end
|
139
159
|
end
|
140
|
-
# rubocop:enable RSpec/
|
160
|
+
# rubocop:enable RSpec/VerifiedDoubles RSpec/MessageSpies
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loga
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Funding Circle
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|