rails_semantic_logger 4.11.0 → 4.13.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 +4 -4
- data/lib/rails_semantic_logger/action_controller/log_subscriber.rb +15 -11
- data/lib/rails_semantic_logger/action_mailer/log_subscriber.rb +3 -3
- data/lib/rails_semantic_logger/action_view/log_subscriber.rb +52 -10
- data/lib/rails_semantic_logger/active_job/log_subscriber.rb +34 -4
- data/lib/rails_semantic_logger/engine.rb +38 -22
- data/lib/rails_semantic_logger/extensions/active_job/logging.rb +5 -1
- data/lib/rails_semantic_logger/extensions/active_support/log_subscriber.rb +11 -0
- data/lib/rails_semantic_logger/extensions/active_support/logger.rb +9 -6
- data/lib/rails_semantic_logger/rack/logger.rb +7 -10
- data/lib/rails_semantic_logger/version.rb +1 -1
- data/lib/rails_semantic_logger.rb +1 -0
- metadata +11 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b82f4b18da96047400658caaf0cbdb073ac21d0d9dfc9f8e89a270fae80550af
|
4
|
+
data.tar.gz: fcef56ce1f917619d302b3dced8680748f0945c3a5a16763aadf21007ef1a00d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ca5b2a92ca494065abb52d7d44eb71e06ba044f190c10b710549b609f78924542eb4f5eb126c54f98bc1248daaa7e1e29b35139c527081f178c1119be76acdc
|
7
|
+
data.tar.gz: 604c669579b6bf2e25b718008406fd2a5bfcacd32f39a5714b05656773e59634d15d10d3afd0277c098bc73f5836e577ad1412669947598b206f22e5af4379d4
|
@@ -14,12 +14,22 @@ module RailsSemanticLogger
|
|
14
14
|
|
15
15
|
# Unused, but needed for Devise 401 status code monkey patch to still work.
|
16
16
|
::ActionController::Base.log_process_action(payload)
|
17
|
+
|
18
|
+
params = payload[:params]
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
if params.kind_of?(Hash) || params.kind_of?(::ActionController::Parameters)
|
21
|
+
# According to PR https://github.com/reidmorrison/rails_semantic_logger/pull/37/files
|
22
|
+
# params is not always a Hash.
|
23
|
+
payload[:params] = params.to_unsafe_h unless params.is_a?(Hash)
|
24
|
+
payload[:params] = params.except(*INTERNAL_PARAMS)
|
25
|
+
|
26
|
+
if payload[:params].empty?
|
27
|
+
payload.delete(:params)
|
28
|
+
elsif params["file"]
|
29
|
+
# When logging to JSON the entire tempfile is logged, so convert it to a string.
|
30
|
+
payload[:params]["file"] = params["file"].inspect
|
31
|
+
end
|
32
|
+
end
|
23
33
|
|
24
34
|
format = payload[:format]
|
25
35
|
payload[:format] = format.to_s.upcase if format.is_a?(Symbol)
|
@@ -48,12 +58,6 @@ module RailsSemanticLogger
|
|
48
58
|
payload.delete(:request)
|
49
59
|
payload.delete(:response)
|
50
60
|
|
51
|
-
params = payload[:params]
|
52
|
-
if params
|
53
|
-
# When logging to JSON the entire tempfile is logged, so convert it to a string.
|
54
|
-
params["file"] = params["file"].inspect if params["file"]
|
55
|
-
end
|
56
|
-
|
57
61
|
{
|
58
62
|
message: "Completed ##{payload[:action]}",
|
59
63
|
duration: event.duration,
|
@@ -9,7 +9,7 @@ module RailsSemanticLogger
|
|
9
9
|
message_id = event.payload[:message_id]
|
10
10
|
duration = event.duration.round(1)
|
11
11
|
if ex
|
12
|
-
|
12
|
+
log_with_formatter event: event, log_duration: true, level: :error do |fmt|
|
13
13
|
{
|
14
14
|
message: "Error delivering mail #{message_id} (#{duration}ms)",
|
15
15
|
exception: ex
|
@@ -17,7 +17,7 @@ module RailsSemanticLogger
|
|
17
17
|
end
|
18
18
|
else
|
19
19
|
message = begin
|
20
|
-
|
20
|
+
if event.payload[:perform_deliveries]
|
21
21
|
"Delivered mail #{message_id} (#{duration}ms)"
|
22
22
|
else
|
23
23
|
"Skipped delivery of mail #{message_id} as `perform_deliveries` is false"
|
@@ -92,7 +92,7 @@ module RailsSemanticLogger
|
|
92
92
|
end
|
93
93
|
|
94
94
|
def formatted_args
|
95
|
-
if defined?(mailer.
|
95
|
+
if defined?(mailer.constantize.log_arguments?) && !mailer.constantize.log_arguments?
|
96
96
|
""
|
97
97
|
else
|
98
98
|
JSON.pretty_generate(event.payload[:args].map { |arg| format(arg) }) if event.payload[:args].present?
|
@@ -19,10 +19,10 @@ module RailsSemanticLogger
|
|
19
19
|
def render_template(event)
|
20
20
|
return unless should_log?
|
21
21
|
|
22
|
-
payload
|
22
|
+
payload = {
|
23
23
|
template: from_rails_root(event.payload[:identifier])
|
24
24
|
}
|
25
|
-
payload[:within]
|
25
|
+
payload[:within] = from_rails_root(event.payload[:layout]) if event.payload[:layout]
|
26
26
|
payload[:allocations] = event.allocations if event.respond_to?(:allocations)
|
27
27
|
|
28
28
|
logger.measure(
|
@@ -36,11 +36,11 @@ module RailsSemanticLogger
|
|
36
36
|
def render_partial(event)
|
37
37
|
return unless should_log?
|
38
38
|
|
39
|
-
payload
|
39
|
+
payload = {
|
40
40
|
partial: from_rails_root(event.payload[:identifier])
|
41
41
|
}
|
42
|
-
payload[:within]
|
43
|
-
payload[:cache]
|
42
|
+
payload[:within] = from_rails_root(event.payload[:layout]) if event.payload[:layout]
|
43
|
+
payload[:cache] = event.payload[:cache_hit] unless event.payload[:cache_hit].nil?
|
44
44
|
payload[:allocations] = event.allocations if event.respond_to?(:allocations)
|
45
45
|
|
46
46
|
logger.measure(
|
@@ -56,11 +56,11 @@ module RailsSemanticLogger
|
|
56
56
|
|
57
57
|
identifier = event.payload[:identifier] || "templates"
|
58
58
|
|
59
|
-
payload
|
59
|
+
payload = {
|
60
60
|
template: from_rails_root(identifier),
|
61
61
|
count: event.payload[:count]
|
62
62
|
}
|
63
|
-
payload[:cache_hits]
|
63
|
+
payload[:cache_hits] = event.payload[:cache_hits] if event.payload[:cache_hits]
|
64
64
|
payload[:allocations] = event.allocations if event.respond_to?(:allocations)
|
65
65
|
|
66
66
|
logger.measure(
|
@@ -72,16 +72,58 @@ module RailsSemanticLogger
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def start(name, id, payload)
|
75
|
-
if (name == "render_template.action_view") && should_log?
|
76
|
-
|
75
|
+
if (name == "render_template.action_view" || name == "render_layout.action_view") && should_log?
|
76
|
+
qualifier = " layout" if name == "render_layout.action_view"
|
77
|
+
payload = { template: from_rails_root(payload[:identifier]) }
|
77
78
|
payload[:within] = from_rails_root(payload[:layout]) if payload[:layout]
|
78
79
|
|
79
|
-
logger.send(self.class.rendered_log_level, message: "Rendering", payload: payload)
|
80
|
+
logger.send(self.class.rendered_log_level, message: "Rendering#{qualifier}", payload: payload)
|
80
81
|
end
|
81
82
|
|
82
83
|
super
|
83
84
|
end
|
84
85
|
|
86
|
+
if (Rails::VERSION::MAJOR == 7 && Rails::VERSION::MINOR >= 1) || Rails::VERSION::MAJOR > 7
|
87
|
+
class Start # :nodoc:
|
88
|
+
def start(name, id, payload)
|
89
|
+
return unless %w[render_template.action_view render_layout.action_view].include?(name)
|
90
|
+
|
91
|
+
qualifier = " layout" if name == "render_layout.action_view"
|
92
|
+
payload = { template: from_rails_root(payload[:identifier]) }
|
93
|
+
payload[:within] = from_rails_root(payload[:layout]) if payload[:layout]
|
94
|
+
|
95
|
+
logger.debug(message: "Rendering#{qualifier}", payload: payload)
|
96
|
+
end
|
97
|
+
|
98
|
+
def finish(name, id, payload) end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def from_rails_root(string)
|
103
|
+
string = string.sub(rails_root, "")
|
104
|
+
string.sub!(VIEWS_PATTERN, "")
|
105
|
+
string
|
106
|
+
end
|
107
|
+
|
108
|
+
def rails_root # :doc:
|
109
|
+
@root ||= "#{Rails.root}/"
|
110
|
+
end
|
111
|
+
|
112
|
+
def logger
|
113
|
+
@logger ||= SemanticLogger["ActionView"]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.attach_to(*)
|
118
|
+
ActiveSupport::Notifications.unsubscribe("render_template.action_view")
|
119
|
+
ActiveSupport::Notifications.unsubscribe("render_layout.action_view")
|
120
|
+
ActiveSupport::Notifications.subscribe("render_template.action_view", RailsSemanticLogger::ActionView::LogSubscriber::Start.new)
|
121
|
+
ActiveSupport::Notifications.subscribe("render_layout.action_view", RailsSemanticLogger::ActionView::LogSubscriber::Start.new)
|
122
|
+
|
123
|
+
super
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
85
127
|
private
|
86
128
|
|
87
129
|
@logger = SemanticLogger["ActionView"]
|
@@ -4,14 +4,44 @@ module RailsSemanticLogger
|
|
4
4
|
module ActiveJob
|
5
5
|
class LogSubscriber < ::ActiveSupport::LogSubscriber
|
6
6
|
def enqueue(event)
|
7
|
-
|
8
|
-
|
7
|
+
ex = event.payload[:exception_object]
|
8
|
+
|
9
|
+
if ex
|
10
|
+
log_with_formatter level: :error, event: event do |fmt|
|
11
|
+
{
|
12
|
+
message: "Failed enqueuing #{fmt.job_info} (#{ex.class} (#{ex.message})",
|
13
|
+
exception: ex
|
14
|
+
}
|
15
|
+
end
|
16
|
+
elsif event.payload[:aborted]
|
17
|
+
log_with_formatter level: :info, event: event do |fmt|
|
18
|
+
{ message: "Failed enqueuing #{fmt.job_info}, a before_enqueue callback halted the enqueuing execution." }
|
19
|
+
end
|
20
|
+
else
|
21
|
+
log_with_formatter event: event do |fmt|
|
22
|
+
{ message: "Enqueued #{fmt.job_info}" }
|
23
|
+
end
|
9
24
|
end
|
10
25
|
end
|
11
26
|
|
12
27
|
def enqueue_at(event)
|
13
|
-
|
14
|
-
|
28
|
+
ex = event.payload[:exception_object]
|
29
|
+
|
30
|
+
if ex
|
31
|
+
log_with_formatter level: :error, event: event do |fmt|
|
32
|
+
{
|
33
|
+
message: "Failed enqueuing #{fmt.job_info} (#{ex.class} (#{ex.message})",
|
34
|
+
exception: ex
|
35
|
+
}
|
36
|
+
end
|
37
|
+
elsif event.payload[:aborted]
|
38
|
+
log_with_formatter level: :info, event: event do |fmt|
|
39
|
+
{ message: "Failed enqueuing #{fmt.job_info}, a before_enqueue callback halted the enqueuing execution." }
|
40
|
+
end
|
41
|
+
else
|
42
|
+
log_with_formatter event: event do |fmt|
|
43
|
+
{message: "Enqueued #{fmt.job_info} at #{fmt.scheduled_at}"}
|
44
|
+
end
|
15
45
|
end
|
16
46
|
end
|
17
47
|
|
@@ -1,7 +1,4 @@
|
|
1
1
|
require "rails"
|
2
|
-
require "action_controller/log_subscriber"
|
3
|
-
require "action_view/log_subscriber"
|
4
|
-
require "action_mailer/log_subscriber"
|
5
2
|
require "rails_semantic_logger/options"
|
6
3
|
|
7
4
|
module RailsSemanticLogger
|
@@ -111,7 +108,14 @@ module RailsSemanticLogger
|
|
111
108
|
Resque.logger = SemanticLogger[Resque] if defined?(Resque) && Resque.respond_to?(:logger=)
|
112
109
|
|
113
110
|
# Replace the Sidekiq logger
|
114
|
-
|
111
|
+
if defined?(Sidekiq)
|
112
|
+
if Sidekiq.respond_to?(:logger=)
|
113
|
+
Sidekiq.logger = SemanticLogger[Sidekiq]
|
114
|
+
elsif Sidekiq::VERSION[0..1] == '7.'
|
115
|
+
method = Sidekiq.server? ? :configure_server : :configure_client
|
116
|
+
Sidekiq.public_send(method) { |cfg| cfg.logger = SemanticLogger[Sidekiq] }
|
117
|
+
end
|
118
|
+
end
|
115
119
|
|
116
120
|
# Replace the Sidetiq logger
|
117
121
|
Sidetiq.logger = SemanticLogger[Sidetiq] if defined?(Sidetiq) && Sidetiq.respond_to?(:logger=)
|
@@ -123,7 +127,7 @@ module RailsSemanticLogger
|
|
123
127
|
end
|
124
128
|
|
125
129
|
# Replace the Bugsnag logger
|
126
|
-
Bugsnag.configure { |config| config.logger = SemanticLogger[Bugsnag] } if defined?(Bugsnag)
|
130
|
+
Bugsnag.configure(false) { |config| config.logger = SemanticLogger[Bugsnag] } if defined?(Bugsnag)
|
127
131
|
|
128
132
|
# Set the IOStreams PGP logger
|
129
133
|
IOStreams::Pgp.logger = SemanticLogger["IOStreams::Pgp"] if defined?(IOStreams)
|
@@ -134,7 +138,7 @@ module RailsSemanticLogger
|
|
134
138
|
config = Rails.application.config
|
135
139
|
|
136
140
|
# Replace the Bugsnag logger
|
137
|
-
Bugsnag.configure { |bugsnag_config| bugsnag_config.logger = SemanticLogger[Bugsnag] } if defined?(Bugsnag)
|
141
|
+
Bugsnag.configure(false) { |bugsnag_config| bugsnag_config.logger = SemanticLogger[Bugsnag] } if defined?(Bugsnag)
|
138
142
|
|
139
143
|
# Rails Patches
|
140
144
|
require("rails_semantic_logger/extensions/action_cable/tagged_logger_proxy") if defined?(::ActionCable)
|
@@ -186,26 +190,38 @@ module RailsSemanticLogger
|
|
186
190
|
end
|
187
191
|
|
188
192
|
# Action View
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
RailsSemanticLogger::ActionView::LogSubscriber
|
193
|
-
|
194
|
-
|
193
|
+
if defined?(::ActionView)
|
194
|
+
require "action_view/log_subscriber"
|
195
|
+
|
196
|
+
RailsSemanticLogger::ActionView::LogSubscriber.rendered_log_level = :info if config.rails_semantic_logger.rendered
|
197
|
+
RailsSemanticLogger.swap_subscriber(
|
198
|
+
::ActionView::LogSubscriber,
|
199
|
+
RailsSemanticLogger::ActionView::LogSubscriber,
|
200
|
+
:action_view
|
201
|
+
)
|
202
|
+
end
|
195
203
|
|
196
204
|
# Action Controller
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
205
|
+
if defined?(::ActionController)
|
206
|
+
require "action_controller/log_subscriber"
|
207
|
+
|
208
|
+
RailsSemanticLogger.swap_subscriber(
|
209
|
+
::ActionController::LogSubscriber,
|
210
|
+
RailsSemanticLogger::ActionController::LogSubscriber,
|
211
|
+
:action_controller
|
212
|
+
)
|
213
|
+
end
|
202
214
|
|
203
215
|
# Action Mailer
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
216
|
+
if defined?(::ActionMailer)
|
217
|
+
require "action_mailer/log_subscriber"
|
218
|
+
|
219
|
+
RailsSemanticLogger.swap_subscriber(
|
220
|
+
::ActionMailer::LogSubscriber,
|
221
|
+
RailsSemanticLogger::ActionMailer::LogSubscriber,
|
222
|
+
:action_mailer
|
223
|
+
)
|
224
|
+
end
|
209
225
|
end
|
210
226
|
|
211
227
|
#
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "active_support/log_subscriber"
|
2
|
+
|
3
|
+
module ActiveSupport
|
4
|
+
class LogSubscriber
|
5
|
+
# @override Rails 7.1
|
6
|
+
def silenced?(event)
|
7
|
+
native_log_level = @event_levels.fetch(event, ::Logger::Severity::FATAL)
|
8
|
+
logger.nil? || SemanticLogger::Levels.index(logger.level) > SemanticLogger::Levels.index(native_log_level)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -4,7 +4,15 @@ module ActiveSupport
|
|
4
4
|
# More hacks to try and stop Rails from being it's own worst enemy.
|
5
5
|
class Logger
|
6
6
|
class << self
|
7
|
-
undef :logger_outputs_to
|
7
|
+
undef :logger_outputs_to?
|
8
|
+
|
9
|
+
# Prevent broadcasting since SemanticLogger already supports multiple loggers
|
10
|
+
if method_defined?(:broadcast)
|
11
|
+
undef :broadcast
|
12
|
+
def broadcast(logger)
|
13
|
+
Module.new
|
14
|
+
end
|
15
|
+
end
|
8
16
|
end
|
9
17
|
|
10
18
|
# Prevent Console from trying to merge loggers
|
@@ -12,11 +20,6 @@ module ActiveSupport
|
|
12
20
|
true
|
13
21
|
end
|
14
22
|
|
15
|
-
# Prevent broadcasting since SemanticLogger already supports multiple loggers
|
16
|
-
def self.broadcast(logger)
|
17
|
-
Module.new
|
18
|
-
end
|
19
|
-
|
20
23
|
def self.new(*args, **kwargs)
|
21
24
|
SemanticLogger[self]
|
22
25
|
end
|
@@ -35,16 +35,18 @@ module RailsSemanticLogger
|
|
35
35
|
@started_request_log_level = :debug
|
36
36
|
|
37
37
|
def call_app(request, env)
|
38
|
-
instrumenter
|
39
|
-
instrumenter.start "request.action_dispatch", request: request
|
38
|
+
instrumenter = ActiveSupport::Notifications.instrumenter
|
39
|
+
instrumenter_state = instrumenter.start "request.action_dispatch", request: request
|
40
|
+
instrumenter_finish = -> () {
|
41
|
+
instrumenter.finish_with_state(instrumenter_state, "request.action_dispatch", request: request)
|
42
|
+
}
|
40
43
|
|
41
44
|
logger.send(self.class.started_request_log_level) { started_request_message(request) }
|
42
|
-
|
43
45
|
status, headers, body = @app.call(env)
|
44
|
-
body = ::Rack::BodyProxy.new(body
|
46
|
+
body = ::Rack::BodyProxy.new(body, &instrumenter_finish)
|
45
47
|
[status, headers, body]
|
46
48
|
rescue Exception
|
47
|
-
|
49
|
+
instrumenter_finish.call
|
48
50
|
raise
|
49
51
|
end
|
50
52
|
|
@@ -90,11 +92,6 @@ module RailsSemanticLogger
|
|
90
92
|
tagged
|
91
93
|
end
|
92
94
|
|
93
|
-
def finish(request)
|
94
|
-
instrumenter = ActiveSupport::Notifications.instrumenter
|
95
|
-
instrumenter.finish "request.action_dispatch", request: request
|
96
|
-
end
|
97
|
-
|
98
95
|
def logger
|
99
96
|
self.class.logger
|
100
97
|
end
|
@@ -58,4 +58,5 @@ end
|
|
58
58
|
|
59
59
|
require("rails_semantic_logger/extensions/mongoid/config") if defined?(Mongoid)
|
60
60
|
require("rails_semantic_logger/extensions/active_support/logger") if defined?(ActiveSupport::Logger)
|
61
|
+
require("rails_semantic_logger/extensions/active_support/log_subscriber") if defined?(ActiveSupport::LogSubscriber)
|
61
62
|
require("rails_semantic_logger/extensions/rack/server") if defined?(Rack::Server)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_semantic_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.13.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '4.
|
47
|
+
version: '4.13'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '4.
|
54
|
+
version: '4.13'
|
55
55
|
description:
|
56
56
|
email:
|
57
57
|
executables: []
|
@@ -75,6 +75,7 @@ files:
|
|
75
75
|
- lib/rails_semantic_logger/extensions/action_view/streaming_template_renderer.rb
|
76
76
|
- lib/rails_semantic_logger/extensions/active_job/logging.rb
|
77
77
|
- lib/rails_semantic_logger/extensions/active_model_serializers/logging.rb
|
78
|
+
- lib/rails_semantic_logger/extensions/active_support/log_subscriber.rb
|
78
79
|
- lib/rails_semantic_logger/extensions/active_support/logger.rb
|
79
80
|
- lib/rails_semantic_logger/extensions/active_support/tagged_logging.rb
|
80
81
|
- lib/rails_semantic_logger/extensions/mongoid/config.rb
|
@@ -86,7 +87,11 @@ files:
|
|
86
87
|
homepage: https://logger.rocketjob.io
|
87
88
|
licenses:
|
88
89
|
- Apache-2.0
|
89
|
-
metadata:
|
90
|
+
metadata:
|
91
|
+
bug_tracker_uri: https://github.com/reidmorrison/rails_semantic_logger/issues
|
92
|
+
documentation_uri: https://logger.rocketjob.io
|
93
|
+
source_code_uri: https://github.com/reidmorrison/rails_semantic_logger/tree/v4.13.0
|
94
|
+
rubygems_mfa_required: 'true'
|
90
95
|
post_install_message:
|
91
96
|
rdoc_options: []
|
92
97
|
require_paths:
|
@@ -102,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
107
|
- !ruby/object:Gem::Version
|
103
108
|
version: '0'
|
104
109
|
requirements: []
|
105
|
-
rubygems_version: 3.
|
110
|
+
rubygems_version: 3.4.9
|
106
111
|
signing_key:
|
107
112
|
specification_version: 4
|
108
113
|
summary: Feature rich logging framework that replaces the Rails logger.
|