lograge 0.10.0 → 0.11.0
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 +5 -5
- data/LICENSE.txt +21 -0
- data/lib/lograge.rb +33 -10
- data/lib/lograge/formatters/graylog2.rb +3 -1
- data/lib/lograge/formatters/helpers/method_and_path.rb +12 -0
- data/lib/lograge/formatters/logstash.rb +3 -1
- data/lib/lograge/log_subscribers/action_cable.rb +32 -0
- data/lib/lograge/log_subscribers/action_controller.rb +73 -0
- data/lib/lograge/log_subscribers/base.rb +70 -0
- data/lib/lograge/rails_ext/action_cable/channel/base.rb +30 -0
- data/lib/lograge/rails_ext/action_cable/connection/base.rb +42 -0
- data/lib/lograge/rails_ext/action_cable/server/base.rb +8 -0
- data/lib/lograge/silent_logger.rb +11 -0
- data/lib/lograge/version.rb +1 -1
- metadata +12 -4
- data/lib/lograge/log_subscriber.rb +0 -122
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e1eb9c940253292149764ed04a37b52b18932e37
|
4
|
+
data.tar.gz: 8f2e6d001d7665291e67f74b20f4d14624f66ce6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b85d69b8fae8f7dc38526068f9bf7bcd3cc5ba4ca6439e99f0d89acfb3b6851676ac100d1c3d02863a189aa45378e497fe4015a873cecfb389e75d896adc9f0
|
7
|
+
data.tar.gz: dd9aa6804d6737c9e48794e5fc8947fc84884043810835dc29ba26a37b5d986e48251279f2e35e39ad0002a877d79ae106d1c3741142dc5fab770759d517023c
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Mathias Meyer
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/lib/lograge.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'lograge/version'
|
2
|
+
require 'lograge/formatters/helpers/method_and_path'
|
2
3
|
require 'lograge/formatters/cee'
|
3
4
|
require 'lograge/formatters/json'
|
4
5
|
require 'lograge/formatters/graylog2'
|
@@ -8,11 +9,19 @@ require 'lograge/formatters/lines'
|
|
8
9
|
require 'lograge/formatters/logstash'
|
9
10
|
require 'lograge/formatters/ltsv'
|
10
11
|
require 'lograge/formatters/raw'
|
11
|
-
require 'lograge/
|
12
|
+
require 'lograge/log_subscribers/base'
|
13
|
+
require 'lograge/log_subscribers/action_cable'
|
14
|
+
require 'lograge/log_subscribers/action_controller'
|
15
|
+
require 'lograge/silent_logger'
|
12
16
|
require 'lograge/ordered_options'
|
13
17
|
require 'active_support/core_ext/module/attribute_accessors'
|
14
18
|
require 'active_support/core_ext/string/inflections'
|
15
19
|
|
20
|
+
if defined?(ActionCable)
|
21
|
+
require 'lograge/rails_ext/action_cable/channel/base'
|
22
|
+
require 'lograge/rails_ext/action_cable/connection/base'
|
23
|
+
end
|
24
|
+
|
16
25
|
# rubocop:disable ModuleLength
|
17
26
|
module Lograge
|
18
27
|
module_function
|
@@ -63,10 +72,14 @@ module Lograge
|
|
63
72
|
def ignore_actions(actions)
|
64
73
|
ignore(lambda do |event|
|
65
74
|
params = event.payload
|
66
|
-
Array(actions).include?("#{params
|
75
|
+
Array(actions).include?("#{controller_field(params)}##{params[:action]}")
|
67
76
|
end)
|
68
77
|
end
|
69
78
|
|
79
|
+
def controller_field(params)
|
80
|
+
params[:controller] || params[:channel_class] || params[:connection_class]
|
81
|
+
end
|
82
|
+
|
70
83
|
def ignore_tests
|
71
84
|
@ignore_tests ||= []
|
72
85
|
end
|
@@ -122,6 +135,8 @@ module Lograge
|
|
122
135
|
keep_original_rails_log
|
123
136
|
|
124
137
|
attach_to_action_controller
|
138
|
+
attach_to_action_cable if defined?(ActionCable)
|
139
|
+
|
125
140
|
set_lograge_log_options
|
126
141
|
setup_custom_payload
|
127
142
|
support_deprecated_config # TODO: Remove with version 1.0
|
@@ -139,24 +154,29 @@ module Lograge
|
|
139
154
|
end
|
140
155
|
|
141
156
|
def attach_to_action_controller
|
142
|
-
Lograge::
|
157
|
+
Lograge::LogSubscribers::ActionController.attach_to :action_controller
|
158
|
+
end
|
159
|
+
|
160
|
+
def attach_to_action_cable
|
161
|
+
Lograge::LogSubscribers::ActionCable.attach_to :action_cable
|
143
162
|
end
|
144
163
|
|
145
164
|
def setup_custom_payload
|
146
165
|
return unless lograge_config.custom_payload_method.respond_to?(:call)
|
147
166
|
|
148
|
-
|
149
|
-
|
150
|
-
if
|
151
|
-
|
167
|
+
base_classes = Array(lograge_config.base_controller_class)
|
168
|
+
base_classes.map! { |klass| klass.try(:constantize) }
|
169
|
+
if base_classes.empty?
|
170
|
+
base_classes << ActionController::Base
|
171
|
+
base_classes << ActionCable::Channel::Base if defined?(ActionCable)
|
152
172
|
end
|
153
173
|
|
154
|
-
|
155
|
-
|
174
|
+
base_classes.each do |base_class|
|
175
|
+
extend_base_class(base_class)
|
156
176
|
end
|
157
177
|
end
|
158
178
|
|
159
|
-
def
|
179
|
+
def extend_base_class(klass)
|
160
180
|
append_payload_method = klass.instance_method(:append_info_to_payload)
|
161
181
|
custom_payload_method = lograge_config.custom_payload_method
|
162
182
|
|
@@ -181,6 +201,9 @@ module Lograge
|
|
181
201
|
return if lograge_config.keep_original_rails_log
|
182
202
|
|
183
203
|
require 'lograge/rails_ext/rack/logger'
|
204
|
+
|
205
|
+
require 'lograge/rails_ext/action_cable/server/base' if defined?(ActionCable)
|
206
|
+
|
184
207
|
Lograge.remove_existing_log_subscriptions
|
185
208
|
end
|
186
209
|
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Lograge
|
2
2
|
module Formatters
|
3
3
|
class Graylog2
|
4
|
+
include Lograge::Formatters::Helpers::MethodAndPath
|
5
|
+
|
4
6
|
def call(data)
|
5
7
|
# Cloning because we don't want to mess with the original when mutating keys.
|
6
8
|
data_clone = data.clone
|
@@ -23,7 +25,7 @@ module Lograge
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def short_message(data)
|
26
|
-
"[#{data[:status]}]
|
28
|
+
"[#{data[:status]}]#{method_and_path_string(data)}(#{data[:controller]}##{data[:action]})"
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Lograge
|
2
|
+
module Formatters
|
3
|
+
module Helpers
|
4
|
+
module MethodAndPath
|
5
|
+
def method_and_path_string(data)
|
6
|
+
method_and_path = [data[:method], data[:path]].compact
|
7
|
+
method_and_path.any?(&:present?) ? " #{method_and_path.join(' ')} " : ' '
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
module Lograge
|
2
2
|
module Formatters
|
3
3
|
class Logstash
|
4
|
+
include Lograge::Formatters::Helpers::MethodAndPath
|
5
|
+
|
4
6
|
def call(data)
|
5
7
|
load_dependencies
|
6
8
|
event = LogStash::Event.new(data)
|
7
9
|
|
8
|
-
event['message'] = "[#{data[:status]}]
|
10
|
+
event['message'] = "[#{data[:status]}]#{method_and_path_string(data)}(#{data[:controller]}##{data[:action]})"
|
9
11
|
event.to_json
|
10
12
|
end
|
11
13
|
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Lograge
|
2
|
+
module LogSubscribers
|
3
|
+
class ActionCable < Base
|
4
|
+
%i(perform_action subscribe unsubscribe connect disconnect).each do |method_name|
|
5
|
+
define_method(method_name) do |event|
|
6
|
+
process_main_event(event)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def initial_data(payload)
|
13
|
+
{
|
14
|
+
method: {},
|
15
|
+
path: {},
|
16
|
+
format: {},
|
17
|
+
params: payload[:data],
|
18
|
+
controller: payload[:channel_class] || payload[:connection_class],
|
19
|
+
action: payload[:action]
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def default_status
|
24
|
+
200
|
25
|
+
end
|
26
|
+
|
27
|
+
def extract_runtimes(event, _payload)
|
28
|
+
{ duration: event.duration.to_f.round(2) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Lograge
|
2
|
+
module LogSubscribers
|
3
|
+
class ActionController < Base
|
4
|
+
def process_action(event)
|
5
|
+
process_main_event(event)
|
6
|
+
end
|
7
|
+
|
8
|
+
def redirect_to(event)
|
9
|
+
RequestStore.store[:lograge_location] = event.payload[:location]
|
10
|
+
end
|
11
|
+
|
12
|
+
def unpermitted_parameters(event)
|
13
|
+
RequestStore.store[:lograge_unpermitted_params] ||= []
|
14
|
+
RequestStore.store[:lograge_unpermitted_params].concat(event.payload[:keys])
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def initial_data(payload)
|
20
|
+
{
|
21
|
+
method: payload[:method],
|
22
|
+
path: extract_path(payload),
|
23
|
+
format: extract_format(payload),
|
24
|
+
controller: payload[:controller],
|
25
|
+
action: payload[:action]
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def extract_path(payload)
|
30
|
+
path = payload[:path]
|
31
|
+
strip_query_string(path)
|
32
|
+
end
|
33
|
+
|
34
|
+
def strip_query_string(path)
|
35
|
+
index = path.index('?')
|
36
|
+
index ? path[0, index] : path
|
37
|
+
end
|
38
|
+
|
39
|
+
if ::ActionPack::VERSION::MAJOR == 3 && ::ActionPack::VERSION::MINOR.zero?
|
40
|
+
def extract_format(payload)
|
41
|
+
payload[:formats].first
|
42
|
+
end
|
43
|
+
else
|
44
|
+
def extract_format(payload)
|
45
|
+
payload[:format]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def extract_runtimes(event, payload)
|
50
|
+
data = { duration: event.duration.to_f.round(2) }
|
51
|
+
data[:view] = payload[:view_runtime].to_f.round(2) if payload.key?(:view_runtime)
|
52
|
+
data[:db] = payload[:db_runtime].to_f.round(2) if payload.key?(:db_runtime)
|
53
|
+
data
|
54
|
+
end
|
55
|
+
|
56
|
+
def extract_location
|
57
|
+
location = RequestStore.store[:lograge_location]
|
58
|
+
return {} unless location
|
59
|
+
|
60
|
+
RequestStore.store[:lograge_location] = nil
|
61
|
+
{ location: strip_query_string(location) }
|
62
|
+
end
|
63
|
+
|
64
|
+
def extract_unpermitted_params
|
65
|
+
unpermitted_params = RequestStore.store[:lograge_unpermitted_params]
|
66
|
+
return {} unless unpermitted_params
|
67
|
+
|
68
|
+
RequestStore.store[:lograge_unpermitted_params] = nil
|
69
|
+
{ unpermitted_params: unpermitted_params }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'action_pack'
|
3
|
+
require 'active_support/core_ext/class/attribute'
|
4
|
+
require 'active_support/log_subscriber'
|
5
|
+
require 'request_store'
|
6
|
+
|
7
|
+
module Lograge
|
8
|
+
module LogSubscribers
|
9
|
+
class Base < ActiveSupport::LogSubscriber
|
10
|
+
def logger
|
11
|
+
Lograge.logger.presence || super
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def process_main_event(event)
|
17
|
+
return if Lograge.ignore?(event)
|
18
|
+
|
19
|
+
payload = event.payload
|
20
|
+
data = extract_request(event, payload)
|
21
|
+
data = before_format(data, payload)
|
22
|
+
formatted_message = Lograge.formatter.call(data)
|
23
|
+
logger.send(Lograge.log_level, formatted_message)
|
24
|
+
end
|
25
|
+
|
26
|
+
def extract_request(event, payload)
|
27
|
+
data = initial_data(payload)
|
28
|
+
data.merge!(extract_status(payload))
|
29
|
+
data.merge!(extract_runtimes(event, payload))
|
30
|
+
data.merge!(extract_location)
|
31
|
+
data.merge!(extract_unpermitted_params)
|
32
|
+
data.merge!(custom_options(event))
|
33
|
+
end
|
34
|
+
|
35
|
+
%i(initial_data extract_status extract_runtimes
|
36
|
+
extract_location extract_unpermitted_params).each do |method_name|
|
37
|
+
define_method(method_name) { |*_arg| {} }
|
38
|
+
end
|
39
|
+
|
40
|
+
def extract_status(payload)
|
41
|
+
if (status = payload[:status])
|
42
|
+
{ status: status.to_i }
|
43
|
+
elsif (error = payload[:exception])
|
44
|
+
exception, message = error
|
45
|
+
{ status: get_error_status_code(exception), error: "#{exception}: #{message}" }
|
46
|
+
else
|
47
|
+
{ status: default_status }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def default_status
|
52
|
+
0
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_error_status_code(exception)
|
56
|
+
status = ActionDispatch::ExceptionWrapper.rescue_responses[exception]
|
57
|
+
Rack::Utils.status_code(status)
|
58
|
+
end
|
59
|
+
|
60
|
+
def custom_options(event)
|
61
|
+
options = Lograge.custom_options(event) || {}
|
62
|
+
options.merge event.payload[:custom_payload] || {}
|
63
|
+
end
|
64
|
+
|
65
|
+
def before_format(data, payload)
|
66
|
+
Lograge.before_format(data, payload)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ActionCable
|
2
|
+
module Channel
|
3
|
+
class Base
|
4
|
+
def subscribe_to_channel
|
5
|
+
ActiveSupport::Notifications.instrument('subscribe.action_cable', notification_payload('subscribe')) do
|
6
|
+
run_callbacks :subscribe do
|
7
|
+
subscribed
|
8
|
+
end
|
9
|
+
|
10
|
+
reject_subscription if subscription_rejected?
|
11
|
+
ensure_confirmation_sent
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def unsubscribe_from_channel
|
16
|
+
ActiveSupport::Notifications.instrument('unsubscribe.action_cable', notification_payload('unsubscribe')) do
|
17
|
+
run_callbacks :unsubscribe do
|
18
|
+
unsubscribed
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def notification_payload(method_name)
|
26
|
+
{ channel_class: self.class.name, action: method_name }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module ActionCable
|
2
|
+
module Connection
|
3
|
+
class Base
|
4
|
+
# rubocop:disable Metrics/MethodLength
|
5
|
+
def handle_open
|
6
|
+
ActiveSupport::Notifications.instrument('connect.action_cable', notification_payload('connect')) do
|
7
|
+
begin
|
8
|
+
@protocol = websocket.protocol
|
9
|
+
connect if respond_to?(:connect)
|
10
|
+
subscribe_to_internal_channel
|
11
|
+
send_welcome_message
|
12
|
+
|
13
|
+
message_buffer.process!
|
14
|
+
server.add_connection(self)
|
15
|
+
rescue ActionCable::Connection::Authorization::UnauthorizedError
|
16
|
+
respond_to_invalid_request
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
# rubocop:enable Metrics/MethodLength
|
21
|
+
|
22
|
+
def handle_close
|
23
|
+
ActiveSupport::Notifications.instrument('disconnect.action_cable', notification_payload('disconnect')) do
|
24
|
+
logger.info finished_request_message if Lograge.lograge_config.keep_original_rails_log
|
25
|
+
|
26
|
+
server.remove_connection(self)
|
27
|
+
|
28
|
+
subscriptions.unsubscribe_from_all
|
29
|
+
unsubscribe_from_internal_channel
|
30
|
+
|
31
|
+
disconnect if respond_to?(:disconnect)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def notification_payload(method_name)
|
38
|
+
{ connection_class: self.class.name, action: method_name, data: request.params }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/lograge/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lograge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mathias Meyer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-04-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -103,9 +103,11 @@ executables: []
|
|
103
103
|
extensions: []
|
104
104
|
extra_rdoc_files: []
|
105
105
|
files:
|
106
|
+
- LICENSE.txt
|
106
107
|
- lib/lograge.rb
|
107
108
|
- lib/lograge/formatters/cee.rb
|
108
109
|
- lib/lograge/formatters/graylog2.rb
|
110
|
+
- lib/lograge/formatters/helpers/method_and_path.rb
|
109
111
|
- lib/lograge/formatters/json.rb
|
110
112
|
- lib/lograge/formatters/key_value.rb
|
111
113
|
- lib/lograge/formatters/l2met.rb
|
@@ -113,10 +115,16 @@ files:
|
|
113
115
|
- lib/lograge/formatters/logstash.rb
|
114
116
|
- lib/lograge/formatters/ltsv.rb
|
115
117
|
- lib/lograge/formatters/raw.rb
|
116
|
-
- lib/lograge/
|
118
|
+
- lib/lograge/log_subscribers/action_cable.rb
|
119
|
+
- lib/lograge/log_subscribers/action_controller.rb
|
120
|
+
- lib/lograge/log_subscribers/base.rb
|
117
121
|
- lib/lograge/ordered_options.rb
|
122
|
+
- lib/lograge/rails_ext/action_cable/channel/base.rb
|
123
|
+
- lib/lograge/rails_ext/action_cable/connection/base.rb
|
124
|
+
- lib/lograge/rails_ext/action_cable/server/base.rb
|
118
125
|
- lib/lograge/rails_ext/rack/logger.rb
|
119
126
|
- lib/lograge/railtie.rb
|
127
|
+
- lib/lograge/silent_logger.rb
|
120
128
|
- lib/lograge/version.rb
|
121
129
|
homepage: https://github.com/roidrage/lograge
|
122
130
|
licenses:
|
@@ -138,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
138
146
|
version: '0'
|
139
147
|
requirements: []
|
140
148
|
rubyforge_project:
|
141
|
-
rubygems_version: 2.
|
149
|
+
rubygems_version: 2.6.14
|
142
150
|
signing_key:
|
143
151
|
specification_version: 4
|
144
152
|
summary: Tame Rails' multi-line logging into a single line per request
|
@@ -1,122 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'action_pack'
|
3
|
-
require 'active_support/core_ext/class/attribute'
|
4
|
-
require 'active_support/log_subscriber'
|
5
|
-
require 'request_store'
|
6
|
-
|
7
|
-
module Lograge
|
8
|
-
class RequestLogSubscriber < ActiveSupport::LogSubscriber
|
9
|
-
def process_action(event)
|
10
|
-
return if Lograge.ignore?(event)
|
11
|
-
|
12
|
-
payload = event.payload
|
13
|
-
data = extract_request(event, payload)
|
14
|
-
data = before_format(data, payload)
|
15
|
-
formatted_message = Lograge.formatter.call(data)
|
16
|
-
logger.send(Lograge.log_level, formatted_message)
|
17
|
-
end
|
18
|
-
|
19
|
-
def redirect_to(event)
|
20
|
-
RequestStore.store[:lograge_location] = event.payload[:location]
|
21
|
-
end
|
22
|
-
|
23
|
-
def unpermitted_parameters(event)
|
24
|
-
RequestStore.store[:lograge_unpermitted_params] ||= []
|
25
|
-
RequestStore.store[:lograge_unpermitted_params].concat(event.payload[:keys])
|
26
|
-
end
|
27
|
-
|
28
|
-
def logger
|
29
|
-
Lograge.logger.presence || super
|
30
|
-
end
|
31
|
-
|
32
|
-
private
|
33
|
-
|
34
|
-
def extract_request(event, payload)
|
35
|
-
payload = event.payload
|
36
|
-
data = initial_data(payload)
|
37
|
-
data.merge!(extract_status(payload))
|
38
|
-
data.merge!(extract_runtimes(event, payload))
|
39
|
-
data.merge!(extract_location)
|
40
|
-
data.merge!(extract_unpermitted_params)
|
41
|
-
data.merge!(custom_options(event))
|
42
|
-
end
|
43
|
-
|
44
|
-
def initial_data(payload)
|
45
|
-
{
|
46
|
-
method: payload[:method],
|
47
|
-
path: extract_path(payload),
|
48
|
-
format: extract_format(payload),
|
49
|
-
controller: payload[:controller],
|
50
|
-
action: payload[:action]
|
51
|
-
}
|
52
|
-
end
|
53
|
-
|
54
|
-
def extract_path(payload)
|
55
|
-
path = payload[:path]
|
56
|
-
strip_query_string(path)
|
57
|
-
end
|
58
|
-
|
59
|
-
def strip_query_string(path)
|
60
|
-
index = path.index('?')
|
61
|
-
index ? path[0, index] : path
|
62
|
-
end
|
63
|
-
|
64
|
-
if ::ActionPack::VERSION::MAJOR == 3 && ::ActionPack::VERSION::MINOR.zero?
|
65
|
-
def extract_format(payload)
|
66
|
-
payload[:formats].first
|
67
|
-
end
|
68
|
-
else
|
69
|
-
def extract_format(payload)
|
70
|
-
payload[:format]
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def extract_status(payload)
|
75
|
-
if (status = payload[:status])
|
76
|
-
{ status: status.to_i }
|
77
|
-
elsif (error = payload[:exception])
|
78
|
-
exception, message = error
|
79
|
-
{ status: get_error_status_code(exception), error: "#{exception}: #{message}" }
|
80
|
-
else
|
81
|
-
{ status: 0 }
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def get_error_status_code(exception)
|
86
|
-
status = ActionDispatch::ExceptionWrapper.rescue_responses[exception]
|
87
|
-
Rack::Utils.status_code(status)
|
88
|
-
end
|
89
|
-
|
90
|
-
def custom_options(event)
|
91
|
-
options = Lograge.custom_options(event) || {}
|
92
|
-
options.merge event.payload[:custom_payload] || {}
|
93
|
-
end
|
94
|
-
|
95
|
-
def before_format(data, payload)
|
96
|
-
Lograge.before_format(data, payload)
|
97
|
-
end
|
98
|
-
|
99
|
-
def extract_runtimes(event, payload)
|
100
|
-
data = { duration: event.duration.to_f.round(2) }
|
101
|
-
data[:view] = payload[:view_runtime].to_f.round(2) if payload.key?(:view_runtime)
|
102
|
-
data[:db] = payload[:db_runtime].to_f.round(2) if payload.key?(:db_runtime)
|
103
|
-
data
|
104
|
-
end
|
105
|
-
|
106
|
-
def extract_location
|
107
|
-
location = RequestStore.store[:lograge_location]
|
108
|
-
return {} unless location
|
109
|
-
|
110
|
-
RequestStore.store[:lograge_location] = nil
|
111
|
-
{ location: strip_query_string(location) }
|
112
|
-
end
|
113
|
-
|
114
|
-
def extract_unpermitted_params
|
115
|
-
unpermitted_params = RequestStore.store[:lograge_unpermitted_params]
|
116
|
-
return {} unless unpermitted_params
|
117
|
-
|
118
|
-
RequestStore.store[:lograge_unpermitted_params] = nil
|
119
|
-
{ unpermitted_params: unpermitted_params }
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|