lograge 0.3.0 → 0.3.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 +7 -0
- data/lib/lograge/formatters/cee.rb +1 -1
- data/lib/lograge/formatters/graylog2.rb +16 -5
- data/lib/lograge/formatters/key_value.rb +12 -20
- data/lib/lograge/formatters/l2met.rb +3 -5
- data/lib/lograge/formatters/lines.rb +18 -0
- data/lib/lograge/formatters/logstash.rb +3 -3
- data/lib/lograge/formatters/raw.rb +1 -1
- data/lib/lograge/log_subscriber.rb +40 -39
- data/lib/lograge/rails_ext/rack/logger.rb +1 -1
- data/lib/lograge/version.rb +1 -1
- data/lib/lograge.rb +42 -26
- metadata +24 -64
- data/.gitignore +0 -4
- data/.rspec +0 -2
- data/.travis.yml +0 -6
- data/CHANGES.md +0 -11
- data/Gemfile +0 -9
- data/Guardfile +0 -9
- data/README.md +0 -235
- data/Rakefile +0 -1
- data/lograge.gemspec +0 -27
- data/spec/formatters/cee_spec.rb +0 -7
- data/spec/formatters/graylog2_spec.rb +0 -18
- data/spec/formatters/json_spec.rb +0 -6
- data/spec/formatters/key_value_spec.rb +0 -22
- data/spec/formatters/l2met_spec.rb +0 -31
- data/spec/formatters/logstash_spec.rb +0 -22
- data/spec/formatters/raw_spec.rb +0 -6
- data/spec/lograge_logsubscriber_spec.rb +0 -261
- data/spec/lograge_spec.rb +0 -84
- data/spec/spec_helper.rb +0 -14
- data/spec/support/examples.rb +0 -20
@@ -1,261 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'lograge'
|
3
|
-
require 'lograge/log_subscriber'
|
4
|
-
require 'active_support/notifications'
|
5
|
-
require 'active_support/core_ext/string'
|
6
|
-
require 'logger'
|
7
|
-
|
8
|
-
describe Lograge::RequestLogSubscriber do
|
9
|
-
let(:log_output) {StringIO.new}
|
10
|
-
let(:logger) {
|
11
|
-
Logger.new(log_output).tap {|logger| logger.formatter = ->(_, _, _, msg) { msg } }
|
12
|
-
}
|
13
|
-
|
14
|
-
let(:subscriber) {Lograge::RequestLogSubscriber.new}
|
15
|
-
let(:event) {
|
16
|
-
ActiveSupport::Notifications::Event.new(
|
17
|
-
'process_action.action_controller', Time.now, Time.now, 2, {
|
18
|
-
status: 200, format: 'application/json', method: 'GET', path: '/home?foo=bar', params: {
|
19
|
-
'controller' => 'home', 'action' => 'index', 'foo' => 'bar'
|
20
|
-
}, db_runtime: 0.02, view_runtime: 0.01
|
21
|
-
}
|
22
|
-
)
|
23
|
-
}
|
24
|
-
let(:redirect) {
|
25
|
-
ActiveSupport::Notifications::Event.new(
|
26
|
-
'redirect_to.action_controller', Time.now, Time.now, 1, location: 'http://example.com', status: 302
|
27
|
-
)
|
28
|
-
}
|
29
|
-
|
30
|
-
before { Lograge.logger = logger }
|
31
|
-
|
32
|
-
describe "with custom_options configured for cee output" do
|
33
|
-
before do
|
34
|
-
Lograge::formatter = ->(data) { "My test: #{data}" }
|
35
|
-
end
|
36
|
-
|
37
|
-
it "should combine the hash properly for the output" do
|
38
|
-
Lograge.custom_options = {:data => "value"}
|
39
|
-
subscriber.process_action(event)
|
40
|
-
log_output.string.should =~ /^My test: {.*:data=>"value"/
|
41
|
-
end
|
42
|
-
it "should combine the output of a lambda properly" do
|
43
|
-
Lograge.custom_options = lambda {|event| {:data => "value"}}
|
44
|
-
subscriber.process_action(event)
|
45
|
-
log_output.string.should =~ /^My test: {.*:data=>"value"/
|
46
|
-
end
|
47
|
-
it "should work if the method returns nil" do
|
48
|
-
Lograge.custom_options = lambda {|event| nil}
|
49
|
-
subscriber.process_action(event)
|
50
|
-
log_output.string.should be_present
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
describe "when processing a redirect" do
|
55
|
-
it "should store the location in a thread local variable" do
|
56
|
-
subscriber.redirect_to(redirect)
|
57
|
-
Thread.current[:lograge_location].should == "http://example.com"
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe "when processing an action with lograge output" do
|
62
|
-
before do
|
63
|
-
Lograge.formatter = Lograge::Formatters::KeyValue.new
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should include the URL in the log output" do
|
67
|
-
subscriber.process_action(event)
|
68
|
-
log_output.string.should include('/home')
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should not include the query string in the url" do
|
72
|
-
subscriber.process_action(event)
|
73
|
-
log_output.string.should_not include('?foo=bar')
|
74
|
-
end
|
75
|
-
|
76
|
-
it "should start the log line with the HTTP method" do
|
77
|
-
subscriber.process_action(event)
|
78
|
-
log_output.string.starts_with?('method=GET ').should == true
|
79
|
-
end
|
80
|
-
|
81
|
-
it "should include the status code" do
|
82
|
-
subscriber.process_action(event)
|
83
|
-
log_output.string.should include('status=200 ')
|
84
|
-
end
|
85
|
-
|
86
|
-
it "should include the controller and action" do
|
87
|
-
subscriber.process_action(event)
|
88
|
-
log_output.string.should include('controller=home action=index')
|
89
|
-
end
|
90
|
-
|
91
|
-
it "should include the duration" do
|
92
|
-
subscriber.process_action(event)
|
93
|
-
log_output.string.should =~ /duration=[\.0-9]{4,4} /
|
94
|
-
end
|
95
|
-
|
96
|
-
it "should include the view rendering time" do
|
97
|
-
subscriber.process_action(event)
|
98
|
-
log_output.string.should =~ /view=0.01 /
|
99
|
-
end
|
100
|
-
|
101
|
-
it "should include the database rendering time" do
|
102
|
-
subscriber.process_action(event)
|
103
|
-
log_output.string.should =~ /db=0.02/
|
104
|
-
end
|
105
|
-
|
106
|
-
it "should add a 500 status when an exception occurred" do
|
107
|
-
event.payload[:status] = nil
|
108
|
-
event.payload[:exception] = ['AbstractController::ActionNotFound', 'Route not found']
|
109
|
-
subscriber.process_action(event)
|
110
|
-
log_output.string.should =~ /status=500 /
|
111
|
-
log_output.string.should =~ /error='AbstractController::ActionNotFound:Route not found' /
|
112
|
-
end
|
113
|
-
|
114
|
-
it "should return an unknown status when no status or exception is found" do
|
115
|
-
event.payload[:status] = nil
|
116
|
-
event.payload[:exception] = nil
|
117
|
-
subscriber.process_action(event)
|
118
|
-
log_output.string.should =~ /status=0 /
|
119
|
-
end
|
120
|
-
|
121
|
-
describe "with a redirect" do
|
122
|
-
before do
|
123
|
-
Thread.current[:lograge_location] = "http://www.example.com"
|
124
|
-
end
|
125
|
-
|
126
|
-
it "should add the location to the log line" do
|
127
|
-
subscriber.process_action(event)
|
128
|
-
log_output.string.should =~ %r{ location=http://www.example.com}
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should remove the thread local variable" do
|
132
|
-
subscriber.process_action(event)
|
133
|
-
Thread.current[:lograge_location].should == nil
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
it "should not include a location by default" do
|
138
|
-
subscriber.process_action(event)
|
139
|
-
log_output.string.should_not =~ /location=/
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
describe "with custom_options configured for lograge output" do
|
144
|
-
before do
|
145
|
-
Lograge.formatter = Lograge::Formatters::KeyValue.new
|
146
|
-
end
|
147
|
-
|
148
|
-
it "should combine the hash properly for the output" do
|
149
|
-
Lograge.custom_options = {:data => "value"}
|
150
|
-
subscriber.process_action(event)
|
151
|
-
log_output.string.should =~ / data=value/
|
152
|
-
end
|
153
|
-
it "should combine the output of a lambda properly" do
|
154
|
-
Lograge.custom_options = lambda {|event| {:data => "value"}}
|
155
|
-
subscriber.process_action(event)
|
156
|
-
log_output.string.should =~ / data=value/
|
157
|
-
end
|
158
|
-
it "should work if the method returns nil" do
|
159
|
-
Lograge.custom_options = lambda {|event| nil}
|
160
|
-
subscriber.process_action(event)
|
161
|
-
log_output.string.should be_present
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
describe "with before_format configured for lograge output" do
|
166
|
-
before do
|
167
|
-
Lograge.formatter = Lograge::Formatters::KeyValue.new
|
168
|
-
Lograge.before_format = nil
|
169
|
-
end
|
170
|
-
|
171
|
-
it "should output correctly" do
|
172
|
-
Lograge.before_format = lambda { |data, payload|
|
173
|
-
Hash[*data.first].merge(Hash[*payload.first])
|
174
|
-
}
|
175
|
-
subscriber.process_action(event)
|
176
|
-
log_output.string.should include("method=GET")
|
177
|
-
log_output.string.should include("status=200")
|
178
|
-
end
|
179
|
-
it "should work if the method returns nil" do
|
180
|
-
Lograge.before_format = lambda {|data, payload| nil}
|
181
|
-
subscriber.process_action(event)
|
182
|
-
log_output.string.should be_present
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
describe "with ignore configured" do
|
187
|
-
before do
|
188
|
-
# Lograge::log_format = :lograge
|
189
|
-
Lograge::ignore_nothing # clear the old ignores before each test
|
190
|
-
end
|
191
|
-
|
192
|
-
it "should not log ignored controller actions given a single ignored action" do
|
193
|
-
Lograge.ignore_actions 'home#index'
|
194
|
-
subscriber.process_action(event)
|
195
|
-
log_output.string.should be_blank
|
196
|
-
end
|
197
|
-
|
198
|
-
it "should not log ignored controller actions given a single ignored action after a custom ignore" do
|
199
|
-
Lograge.ignore(lambda {|event| false})
|
200
|
-
Lograge.ignore_actions 'home#index'
|
201
|
-
subscriber.process_action(event)
|
202
|
-
log_output.string.should be_blank
|
203
|
-
end
|
204
|
-
|
205
|
-
it "should log non-ignored controller actions given a single ignored action" do
|
206
|
-
Lograge.ignore_actions 'foo#bar'
|
207
|
-
subscriber.process_action(event)
|
208
|
-
log_output.string.should_not be_blank
|
209
|
-
end
|
210
|
-
|
211
|
-
it "should not log ignored controller actions given multiple ignored actions" do
|
212
|
-
Lograge.ignore_actions ['foo#bar', 'home#index', 'bar#foo']
|
213
|
-
subscriber.process_action(event)
|
214
|
-
log_output.string.should be_blank
|
215
|
-
end
|
216
|
-
|
217
|
-
it "should log non-ignored controller actions given multiple ignored actions" do
|
218
|
-
Lograge.ignore_actions ['foo#bar', 'bar#foo']
|
219
|
-
subscriber.process_action(event)
|
220
|
-
log_output.string.should_not be_blank
|
221
|
-
end
|
222
|
-
|
223
|
-
it "should not log ignored events" do
|
224
|
-
Lograge.ignore(lambda do |event|
|
225
|
-
'GET' == event.payload[:method]
|
226
|
-
end)
|
227
|
-
subscriber.process_action(event)
|
228
|
-
log_output.string.should be_blank
|
229
|
-
end
|
230
|
-
|
231
|
-
it "should log non-ignored events" do
|
232
|
-
Lograge.ignore(lambda do |event|
|
233
|
-
'foo' == event.payload[:method]
|
234
|
-
end)
|
235
|
-
subscriber.process_action(event)
|
236
|
-
log_output.string.should_not be_blank
|
237
|
-
end
|
238
|
-
|
239
|
-
it "should not choke on nil ignore_actions input" do
|
240
|
-
Lograge.ignore_actions nil
|
241
|
-
subscriber.process_action(event)
|
242
|
-
log_output.string.should_not be_blank
|
243
|
-
end
|
244
|
-
|
245
|
-
it "should not choke on nil ignore input" do
|
246
|
-
Lograge.ignore nil
|
247
|
-
subscriber.process_action(event)
|
248
|
-
log_output.string.should_not be_blank
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
it "should fallback to ActiveSupport's logger if one isn't configured" do
|
253
|
-
Lograge.formatter = Lograge::Formatters::KeyValue.new
|
254
|
-
Lograge.logger = nil
|
255
|
-
ActiveSupport::LogSubscriber.logger = logger
|
256
|
-
|
257
|
-
subscriber.process_action(event)
|
258
|
-
|
259
|
-
log_output.string.should be_present
|
260
|
-
end
|
261
|
-
end
|
data/spec/lograge_spec.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'lograge'
|
3
|
-
require 'active_support/notifications'
|
4
|
-
require 'active_support/core_ext/string'
|
5
|
-
require 'active_support/log_subscriber'
|
6
|
-
require 'action_controller/log_subscriber'
|
7
|
-
require 'action_view/log_subscriber'
|
8
|
-
|
9
|
-
describe Lograge do
|
10
|
-
describe "when removing Rails' log subscribers" do
|
11
|
-
after do
|
12
|
-
ActionController::LogSubscriber.attach_to :action_controller
|
13
|
-
ActionView::LogSubscriber.attach_to :action_view
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should remove subscribers for controller events" do
|
17
|
-
expect {
|
18
|
-
Lograge.remove_existing_log_subscriptions
|
19
|
-
}.to change {
|
20
|
-
ActiveSupport::Notifications.notifier.listeners_for('process_action.action_controller')
|
21
|
-
}
|
22
|
-
end
|
23
|
-
|
24
|
-
it "should remove subscribers for all events" do
|
25
|
-
expect {
|
26
|
-
Lograge.remove_existing_log_subscriptions
|
27
|
-
}.to change {
|
28
|
-
ActiveSupport::Notifications.notifier.listeners_for('render_template.action_view')
|
29
|
-
}
|
30
|
-
end
|
31
|
-
|
32
|
-
it "shouldn't remove subscribers that aren't from Rails" do
|
33
|
-
blk = -> {}
|
34
|
-
ActiveSupport::Notifications.subscribe("process_action.action_controller", &blk)
|
35
|
-
Lograge.remove_existing_log_subscriptions
|
36
|
-
listeners = ActiveSupport::Notifications.notifier.listeners_for('process_action.action_controller')
|
37
|
-
listeners.size.should > 0
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe 'deprecated log_format interpreter' do
|
42
|
-
let(:app_config) do
|
43
|
-
double(config:
|
44
|
-
ActiveSupport::OrderedOptions.new.tap do |config|
|
45
|
-
config.action_dispatch = double(rack_cache: false)
|
46
|
-
config.lograge = ActiveSupport::OrderedOptions.new
|
47
|
-
config.lograge.log_format = format
|
48
|
-
end
|
49
|
-
)
|
50
|
-
end
|
51
|
-
before { ActiveSupport::Deprecation.silence { Lograge.setup(app_config) } }
|
52
|
-
subject { Lograge.formatter }
|
53
|
-
|
54
|
-
context ':cee' do
|
55
|
-
let(:format) { :cee }
|
56
|
-
it { should be_instance_of(Lograge::Formatters::Cee) }
|
57
|
-
end
|
58
|
-
|
59
|
-
context ':raw' do
|
60
|
-
let(:format) { :raw }
|
61
|
-
it { should be_instance_of(Lograge::Formatters::Raw) }
|
62
|
-
end
|
63
|
-
|
64
|
-
context ':logstash' do
|
65
|
-
let(:format) { :logstash }
|
66
|
-
it { should be_instance_of(Lograge::Formatters::Logstash) }
|
67
|
-
end
|
68
|
-
|
69
|
-
context ':graylog2' do
|
70
|
-
let(:format) { :graylog2 }
|
71
|
-
it { should be_instance_of(Lograge::Formatters::Graylog2) }
|
72
|
-
end
|
73
|
-
|
74
|
-
context ':lograge' do
|
75
|
-
let(:format) { :lograge }
|
76
|
-
it { should be_instance_of(Lograge::Formatters::KeyValue) }
|
77
|
-
end
|
78
|
-
|
79
|
-
context 'default' do
|
80
|
-
let(:format) { nil }
|
81
|
-
it { should be_instance_of(Lograge::Formatters::KeyValue) }
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
-
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
-
# Require this file using `require "spec_helper.rb"` to ensure that it is only
|
4
|
-
# loaded once.
|
5
|
-
#
|
6
|
-
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
-
require 'action_pack'
|
8
|
-
require 'support/examples'
|
9
|
-
|
10
|
-
RSpec.configure do |config|
|
11
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
12
|
-
config.run_all_when_everything_filtered = true
|
13
|
-
config.filter_run :focus
|
14
|
-
end
|
data/spec/support/examples.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
|
2
|
-
shared_examples_for "a key value formatter" do
|
3
|
-
let(:payload) do
|
4
|
-
{
|
5
|
-
custom: 'data',
|
6
|
-
status: 200,
|
7
|
-
method: 'GET',
|
8
|
-
path: '/',
|
9
|
-
controller: 'welcome',
|
10
|
-
action: 'index'
|
11
|
-
}
|
12
|
-
end
|
13
|
-
|
14
|
-
subject { described_class.new.call(payload) }
|
15
|
-
|
16
|
-
it { should include('method=GET') }
|
17
|
-
it { should include('path=/') }
|
18
|
-
it { should include('status=200') }
|
19
|
-
it { should include('custom=data') }
|
20
|
-
end
|