lograge 0.11.2 → 0.14.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b182acc461273304ebb8b5395f65c4eeec4a170639d0b52b0d608a1aa786c03
4
- data.tar.gz: e558ad86b2ae007d24c18d3e15ca2262f61432058508c22feba1c0f63d5ec9be
3
+ metadata.gz: 0d989dce1202da74220c6ac7926c3ef413502644e6f456589a334278ea357a4d
4
+ data.tar.gz: be68c46645948d5cc157a475b8820f50453fecaf9cc5e0f23bc842ec432eaa48
5
5
  SHA512:
6
- metadata.gz: d9bda7af87bbd4020194aae53d44f29585eadf590d03e490276f025dadbb5bc189d94e9e270437bbb857c0b3da91b9a91f1ba7c833d84d19f835bae7b1960c09
7
- data.tar.gz: 125e9f98472208bc85f5fe2f810ccfae3b26c53511204fc96a808bfdf2fd1fa8046ada14a4c001abf7d59cf5c2b81eb3a5a5020eddc994fb22e8b68eb9b632af
6
+ metadata.gz: 273878d74ebdf36f2e703f6c4f0c70e6e17633f13dfc82bc7297ee5b209bb640a09da601768d16d4ca839bb22dfad7f0b8ee832676e4d94d4a96a90b1b5bfadc
7
+ data.tar.gz: c8503e3b547652a44076a858d0d566b1c75a273ef3efc6357398f7d5c41be7b656cf09687f96c1fe2437d16e4d8c8a657bfb7665055dab16e3a05230adf80e40
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2016 Mathias Meyer
3
+ Copyright (c) Mathias Meyer
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Formatters
3
5
  class Cee
@@ -1,23 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Formatters
3
5
  class Graylog2
4
6
  include Lograge::Formatters::Helpers::MethodAndPath
5
7
 
6
8
  def call(data)
7
- # Cloning because we don't want to mess with the original when mutating keys.
8
- data_clone = data.clone
9
-
10
- base = {
11
- short_message: short_message(data_clone)
12
- }
13
-
14
9
  # Add underscore to every key to follow GELF additional field syntax.
15
- data_clone.keys.each do |key|
16
- data_clone[underscore_prefix(key)] = data_clone[key]
17
- data_clone.delete(key)
18
- end
19
-
20
- data_clone.merge(base)
10
+ data.transform_keys { |k| underscore_prefix(k) }.merge(
11
+ short_message: short_message(data)
12
+ )
21
13
  end
22
14
 
23
15
  def underscore_prefix(key)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Formatters
3
5
  module Helpers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  module Lograge
3
5
  module Formatters
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Formatters
3
5
  class KeyValue
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lograge
4
+ module Formatters
5
+ class KeyValueDeep < KeyValue
6
+ def call(data)
7
+ super flatten_keys(data)
8
+ end
9
+
10
+ protected
11
+
12
+ def flatten_keys(data, prefix = '')
13
+ return flatten_object(data, prefix) if [Hash, Array].include? data.class
14
+
15
+ data
16
+ end
17
+
18
+ def flatten_object(data, prefix)
19
+ result = {}
20
+ loop_on_object(data) do |key, value|
21
+ key = "#{prefix}_#{key}" unless prefix.empty?
22
+ if [Hash, Array].include? value.class
23
+ result.merge!(flatten_keys(value, key))
24
+ else
25
+ result[key] = value
26
+ end
27
+ end
28
+ result
29
+ end
30
+
31
+ def loop_on_object(data, &block)
32
+ if data.instance_of? Array
33
+ data.each_with_index do |value, index|
34
+ yield index, value
35
+ end
36
+ return
37
+ end
38
+ data.each(&block)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,24 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'lograge/formatters/key_value'
2
4
 
3
5
  module Lograge
4
6
  module Formatters
5
7
  class L2met < KeyValue
6
- L2MET_FIELDS = [
7
- :method,
8
- :path,
9
- :format,
10
- :source,
11
- :status,
12
- :error,
13
- :duration,
14
- :view,
15
- :db,
16
- :location
8
+ L2MET_FIELDS = %i[
9
+ method
10
+ path
11
+ format
12
+ source
13
+ status
14
+ error
15
+ duration
16
+ view
17
+ db
18
+ location
17
19
  ].freeze
18
20
 
19
- UNWANTED_FIELDS = [
20
- :controller,
21
- :action
21
+ UNWANTED_FIELDS = %i[
22
+ controller
23
+ action
22
24
  ].freeze
23
25
 
24
26
  def call(data)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Formatters
3
5
  class Lines
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Formatters
3
5
  class Logstash
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Formatters
3
5
  class LTSV
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Formatters
3
5
  class Raw
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module LogSubscribers
3
5
  class ActionCable < Base
4
- %i(perform_action subscribe unsubscribe connect disconnect).each do |method_name|
6
+ %i[perform_action subscribe unsubscribe connect disconnect].each do |method_name|
5
7
  define_method(method_name) do |event|
6
8
  process_main_event(event)
7
9
  end
@@ -11,9 +13,9 @@ module Lograge
11
13
 
12
14
  def initial_data(payload)
13
15
  {
14
- method: {},
15
- path: {},
16
- format: {},
16
+ method: nil,
17
+ path: nil,
18
+ format: nil,
17
19
  params: payload[:data],
18
20
  controller: payload[:channel_class] || payload[:connection_class],
19
21
  action: payload[:action]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module LogSubscribers
3
5
  class ActionController < Base
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'action_pack'
5
+ require 'active_support'
3
6
  require 'active_support/core_ext/class/attribute'
4
7
  require 'active_support/log_subscriber'
5
8
  require 'request_store'
@@ -26,14 +29,15 @@ module Lograge
26
29
  def extract_request(event, payload)
27
30
  data = initial_data(payload)
28
31
  data.merge!(extract_status(payload))
32
+ data.merge!(extract_allocations(event))
29
33
  data.merge!(extract_runtimes(event, payload))
30
34
  data.merge!(extract_location)
31
35
  data.merge!(extract_unpermitted_params)
32
36
  data.merge!(custom_options(event))
33
37
  end
34
38
 
35
- %i(initial_data extract_status extract_runtimes
36
- extract_location extract_unpermitted_params).each do |method_name|
39
+ %i[initial_data extract_status extract_runtimes
40
+ extract_location extract_unpermitted_params].each do |method_name|
37
41
  define_method(method_name) { |*_arg| {} }
38
42
  end
39
43
 
@@ -52,9 +56,16 @@ module Lograge
52
56
  0
53
57
  end
54
58
 
55
- def get_error_status_code(exception)
56
- status = ActionDispatch::ExceptionWrapper.rescue_responses[exception]
57
- Rack::Utils.status_code(status)
59
+ def get_error_status_code(exception_class_name)
60
+ ActionDispatch::ExceptionWrapper.status_code_for_exception(exception_class_name)
61
+ end
62
+
63
+ def extract_allocations(event)
64
+ if (allocations = (event.respond_to?(:allocations) && event.allocations))
65
+ { allocations: allocations }
66
+ else
67
+ {}
68
+ end
58
69
  end
59
70
 
60
71
  def custom_options(event)
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support'
1
4
  require 'active_support/ordered_options'
2
5
 
3
6
  module Lograge
@@ -1,22 +1,15 @@
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
1
+ # frozen_string_literal: true
9
2
 
10
- reject_subscription if subscription_rejected?
11
- ensure_confirmation_sent
12
- end
3
+ module Lograge
4
+ module ActionCable
5
+ module ChannelInstrumentation
6
+ def subscribe_to_channel
7
+ ActiveSupport::Notifications.instrument('subscribe.action_cable', notification_payload('subscribe')) { super }
13
8
  end
14
9
 
15
10
  def unsubscribe_from_channel
16
11
  ActiveSupport::Notifications.instrument('unsubscribe.action_cable', notification_payload('unsubscribe')) do
17
- run_callbacks :unsubscribe do
18
- unsubscribed
19
- end
12
+ super
20
13
  end
21
14
  end
22
15
 
@@ -28,3 +21,5 @@ module ActionCable
28
21
  end
29
22
  end
30
23
  end
24
+
25
+ ActionCable::Channel::Base.prepend(Lograge::ActionCable::ChannelInstrumentation)
@@ -1,42 +1,21 @@
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
1
+ # frozen_string_literal: true
12
2
 
13
- message_buffer.process!
14
- server.add_connection(self)
15
- rescue ActionCable::Connection::Authorization::UnauthorizedError
16
- respond_to_invalid_request
17
- end
18
- end
3
+ module Lograge
4
+ module ActionCable
5
+ module ConnectionInstrumentation
6
+ def handle_open
7
+ ActiveSupport::Notifications.instrument('connect.action_cable', notification_payload('connect')) { super }
19
8
  end
20
- # rubocop:enable Metrics/MethodLength
21
9
 
22
10
  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
11
+ ActiveSupport::Notifications.instrument('disconnect.action_cable', notification_payload('disconnect')) { super }
33
12
  end
34
13
 
35
- private
36
-
37
14
  def notification_payload(method_name)
38
15
  { connection_class: self.class.name, action: method_name, data: request.params }
39
16
  end
40
17
  end
41
18
  end
42
19
  end
20
+
21
+ ActionCable::Connection::Base.prepend(Lograge::ActionCable::ConnectionInstrumentation)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionCable
2
4
  module Server
3
5
  class Base
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support'
1
4
  require 'active_support/concern'
2
5
  require 'rails/rack/logger'
3
6
 
@@ -9,17 +12,19 @@ module Rails
9
12
  # that say:
10
13
  # Started GET / for 192.168.2.1...
11
14
  class Logger
12
- # Overwrites Rails 3.2 code that logs new requests
15
+ # Overwrites Rails code that logs new requests
13
16
  def call_app(*args)
14
17
  env = args.last
15
- @app.call(env)
18
+ status, headers, body = @app.call(env)
19
+ # needs to have same return type as the Rails builtins being overridden, see https://github.com/roidrage/lograge/pull/333
20
+ # https://github.com/rails/rails/blob/be9d34b9bcb448b265114ebc28bef1a5b5e4c272/railties/lib/rails/rack/logger.rb#L37
21
+ [status, headers, ::Rack::BodyProxy.new(body) {}] # rubocop:disable Lint/EmptyBlock
16
22
  ensure
17
23
  ActiveSupport::LogSubscriber.flush_all!
18
24
  end
19
25
 
20
26
  # Overwrites Rails 3.0/3.1 code that logs new requests
21
- def before_dispatch(_env)
22
- end
27
+ def before_dispatch(_env); end
23
28
  end
24
29
  end
25
30
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/railtie'
2
4
  require 'action_view/log_subscriber'
3
5
  require 'action_controller/log_subscriber'
@@ -7,6 +9,10 @@ module Lograge
7
9
  config.lograge = Lograge::OrderedOptions.new
8
10
  config.lograge.enabled = false
9
11
 
12
+ initializer :deprecator do |app|
13
+ app.deprecators[:lograge] = Lograge.deprecator if app.respond_to?(:deprecators)
14
+ end
15
+
10
16
  config.after_initialize do |app|
11
17
  Lograge.setup(app) if app.config.lograge.enabled
12
18
  end
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+
1
5
  module Lograge
2
6
  class SilentLogger < SimpleDelegator
3
- def initialize(logger)
4
- super
5
- end
6
-
7
- %i(debug info warn error fatal unknown).each do |method_name|
7
+ %i[debug info warn error fatal unknown].each do |method_name|
8
+ # rubocop:disable Lint/EmptyBlock
8
9
  define_method(method_name) { |*_args| }
10
+ # rubocop:enable Lint/EmptyBlock
9
11
  end
10
12
  end
11
13
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
- VERSION = '0.11.2'.freeze
4
+ VERSION = '0.14.0'
3
5
  end
data/lib/lograge.rb CHANGED
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'lograge/version'
2
4
  require 'lograge/formatters/helpers/method_and_path'
3
5
  require 'lograge/formatters/cee'
4
6
  require 'lograge/formatters/json'
5
7
  require 'lograge/formatters/graylog2'
6
8
  require 'lograge/formatters/key_value'
9
+ require 'lograge/formatters/key_value_deep'
7
10
  require 'lograge/formatters/l2met'
8
11
  require 'lograge/formatters/lines'
9
12
  require 'lograge/formatters/logstash'
@@ -14,10 +17,11 @@ require 'lograge/log_subscribers/action_cable'
14
17
  require 'lograge/log_subscribers/action_controller'
15
18
  require 'lograge/silent_logger'
16
19
  require 'lograge/ordered_options'
20
+ require 'active_support'
17
21
  require 'active_support/core_ext/module/attribute_accessors'
18
22
  require 'active_support/core_ext/string/inflections'
19
23
 
20
- # rubocop:disable ModuleLength
24
+ # rubocop:disable Metrics/ModuleLength
21
25
  module Lograge
22
26
  module_function
23
27
 
@@ -116,10 +120,8 @@ module Lograge
116
120
  def unsubscribe(component, subscriber)
117
121
  events = subscriber.public_methods(false).reject { |method| method.to_s == 'call' }
118
122
  events.each do |event|
119
- ActiveSupport::Notifications.notifier.listeners_for("#{event}.#{component}").each do |listener|
120
- if listener.instance_variable_get('@delegate') == subscriber
121
- ActiveSupport::Notifications.unsubscribe listener
122
- end
123
+ Lograge.notification_listeners_for("#{event}.#{component}").each do |listener|
124
+ ActiveSupport::Notifications.unsubscribe listener if listener.instance_variable_get('@delegate') == subscriber
123
125
  end
124
126
  end
125
127
  end
@@ -203,7 +205,7 @@ module Lograge
203
205
  end
204
206
 
205
207
  def rack_cache_hashlike?(app)
206
- app.config.action_dispatch.rack_cache && app.config.action_dispatch.rack_cache.respond_to?(:[]=)
208
+ app.config.action_dispatch.rack_cache&.respond_to?(:[]=)
207
209
  end
208
210
  private_class_method :rack_cache_hashlike?
209
211
 
@@ -214,7 +216,7 @@ module Lograge
214
216
 
215
217
  legacy_log_format = lograge_config.log_format
216
218
  warning = 'config.lograge.log_format is deprecated. Use config.lograge.formatter instead.'
217
- ActiveSupport::Deprecation.warn(warning, caller)
219
+ deprecator.warn(warning, caller)
218
220
  legacy_log_format = :key_value if legacy_log_format == :lograge
219
221
  lograge_config.formatter = "Lograge::Formatters::#{legacy_log_format.to_s.classify}".constantize.new
220
222
  end
@@ -222,6 +224,22 @@ module Lograge
222
224
  def lograge_config
223
225
  application.config.lograge
224
226
  end
227
+
228
+ def deprecator
229
+ @deprecator ||= ActiveSupport::Deprecation.new('1.0', 'Lograge')
230
+ end
231
+
232
+ if ::ActiveSupport::VERSION::MAJOR >= 8 ||
233
+ (::ActiveSupport::VERSION::MAJOR >= 7 && ::ActiveSupport::VERSION::MINOR >= 1)
234
+ def notification_listeners_for(name)
235
+ ActiveSupport::Notifications.notifier.all_listeners_for(name)
236
+ end
237
+ else
238
+ def notification_listeners_for(name)
239
+ ActiveSupport::Notifications.notifier.listeners_for(name)
240
+ end
241
+ end
225
242
  end
243
+ # rubocop:enable Metrics/ModuleLength
226
244
 
227
245
  require 'lograge/railtie' if defined?(Rails)
metadata CHANGED
@@ -1,46 +1,61 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lograge
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.2
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mathias Meyer
8
8
  - Ben Lovell
9
- autorequire:
9
+ - Michael Bianco
10
+ autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2019-06-14 00:00:00.000000000 Z
13
+ date: 2023-10-10 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: rspec
16
17
  requirement: !ruby/object:Gem::Requirement
17
18
  requirements:
18
- - - ">="
19
+ - - "~>"
19
20
  - !ruby/object:Gem::Version
20
- version: '0'
21
+ version: '3.1'
21
22
  type: :development
22
23
  prerelease: false
23
24
  version_requirements: !ruby/object:Gem::Requirement
24
25
  requirements:
25
- - - ">="
26
+ - - "~>"
26
27
  - !ruby/object:Gem::Version
27
- version: '0'
28
+ version: '3.1'
28
29
  - !ruby/object:Gem::Dependency
29
30
  name: rubocop
30
31
  requirement: !ruby/object:Gem::Requirement
31
32
  requirements:
32
- - - '='
33
+ - - "~>"
33
34
  - !ruby/object:Gem::Version
34
- version: 0.46.0
35
+ version: '1.23'
35
36
  type: :development
36
37
  prerelease: false
37
38
  version_requirements: !ruby/object:Gem::Requirement
38
39
  requirements:
39
- - - '='
40
+ - - "~>"
40
41
  - !ruby/object:Gem::Version
41
- version: 0.46.0
42
+ version: '1.23'
42
43
  - !ruby/object:Gem::Dependency
43
- name: activesupport
44
+ name: simplecov
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.21'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '0.21'
57
+ - !ruby/object:Gem::Dependency
58
+ name: actionpack
44
59
  requirement: !ruby/object:Gem::Requirement
45
60
  requirements:
46
61
  - - ">="
@@ -54,7 +69,7 @@ dependencies:
54
69
  - !ruby/object:Gem::Version
55
70
  version: '4'
56
71
  - !ruby/object:Gem::Dependency
57
- name: actionpack
72
+ name: activesupport
58
73
  requirement: !ruby/object:Gem::Requirement
59
74
  requirements:
60
75
  - - ">="
@@ -99,6 +114,7 @@ description: Tame Rails' multi-line logging into a single line per request
99
114
  email:
100
115
  - meyer@paperplanes.de
101
116
  - benjamin.lovell@gmail.com
117
+ - mike@mikebian.co
102
118
  executables: []
103
119
  extensions: []
104
120
  extra_rdoc_files: []
@@ -110,6 +126,7 @@ files:
110
126
  - lib/lograge/formatters/helpers/method_and_path.rb
111
127
  - lib/lograge/formatters/json.rb
112
128
  - lib/lograge/formatters/key_value.rb
129
+ - lib/lograge/formatters/key_value_deep.rb
113
130
  - lib/lograge/formatters/l2met.rb
114
131
  - lib/lograge/formatters/lines.rb
115
132
  - lib/lograge/formatters/logstash.rb
@@ -129,8 +146,10 @@ files:
129
146
  homepage: https://github.com/roidrage/lograge
130
147
  licenses:
131
148
  - MIT
132
- metadata: {}
133
- post_install_message:
149
+ metadata:
150
+ rubygems_mfa_required: 'true'
151
+ changelog_uri: https://github.com/roidrage/lograge/blob/master/CHANGELOG.md
152
+ post_install_message:
134
153
  rdoc_options: []
135
154
  require_paths:
136
155
  - lib
@@ -138,16 +157,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
138
157
  requirements:
139
158
  - - ">="
140
159
  - !ruby/object:Gem::Version
141
- version: '0'
160
+ version: '2.5'
142
161
  required_rubygems_version: !ruby/object:Gem::Requirement
143
162
  requirements:
144
163
  - - ">="
145
164
  - !ruby/object:Gem::Version
146
165
  version: '0'
147
166
  requirements: []
148
- rubyforge_project:
149
- rubygems_version: 2.7.6
150
- signing_key:
167
+ rubygems_version: 3.4.10
168
+ signing_key:
151
169
  specification_version: 4
152
170
  summary: Tame Rails' multi-line logging into a single line per request
153
171
  test_files: []