rails_semantic_logger 4.16.0 → 4.17.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -3
- data/lib/rails_semantic_logger/engine.rb +27 -8
- data/lib/rails_semantic_logger/extensions/sidekiq/sidekiq.rb +3 -175
- data/lib/rails_semantic_logger/sidekiq/defaults.rb +40 -0
- data/lib/rails_semantic_logger/sidekiq/job_logger.rb +59 -0
- data/lib/rails_semantic_logger/sidekiq/loggable.rb +10 -0
- data/lib/rails_semantic_logger/version.rb +1 -1
- data/lib/rails_semantic_logger.rb +6 -0
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a96d9dc4eb844eb8561d52f66dc27e2e07edb6b61da2163b0351ce3b12759ff
|
4
|
+
data.tar.gz: 34145d723bd89d14e5377200862df57829739b2ee5e5422a58f1d0edd4cbff0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e99c63ad9e4d02377d5ea25ba528f5de4fa8f83a2aadd7ef19ef2e3b8f52fc67cd2d08130ec18478ab4e5a2785657928f4e863024d8214a76de3bff4618b6891
|
7
|
+
data.tar.gz: 2d6ccc0cb9e385a2ca3a0fdc65023948f968a83b044768fc9bc9ccfb78452d7d4325731cdc4c5397bb097efa1ad72a1ce05d5576429cb2eb05b8c984fa7f06bb
|
data/README.md
CHANGED
@@ -87,7 +87,7 @@ The queue latency is the time between when the job was enqueued and when it was
|
|
87
87
|
filter environment = "production"
|
88
88
|
filter level = "info"
|
89
89
|
filter metric = "sidekiq.queue.latency"
|
90
|
-
timechart
|
90
|
+
timechart latency:avg(metric_amount/1000), group_by(string(named_tags.queue))
|
91
91
|
~~~
|
92
92
|
|
93
93
|
* http://github.com/reidmorrison/rails_semantic_logger
|
@@ -100,8 +100,12 @@ For complete documentation see: https://logger.rocketjob.io/rails
|
|
100
100
|
|
101
101
|
Rails Semantic Logger now supports Sidekiq metrics.
|
102
102
|
Below are the metrics that are now available when the JSON logging format is used:
|
103
|
-
- `sidekiq.job.perform`
|
104
|
-
-
|
103
|
+
- `sidekiq.job.perform`
|
104
|
+
- The duration of each Sidekiq job.
|
105
|
+
- `duration` contains the time in milliseconds that the job took to run.
|
106
|
+
- `sidekiq.queue.latency`
|
107
|
+
- The time between when a Sidekiq job was enqueued and when it was started.
|
108
|
+
- `metric_amount` contains the time in milliseconds that the job was waiting in the queue.
|
105
109
|
|
106
110
|
## Upgrading to Semantic Logger v4.15 & V4.16 - Sidekiq Support
|
107
111
|
|
@@ -108,12 +108,31 @@ module RailsSemanticLogger
|
|
108
108
|
Resque.logger = SemanticLogger[Resque] if defined?(Resque) && Resque.respond_to?(:logger=)
|
109
109
|
|
110
110
|
# Replace the Sidekiq logger
|
111
|
-
if defined?(Sidekiq)
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
111
|
+
if defined?(::Sidekiq)
|
112
|
+
::Sidekiq.configure_client do |config|
|
113
|
+
config.logger = ::SemanticLogger[::Sidekiq]
|
114
|
+
end
|
115
|
+
|
116
|
+
::Sidekiq.configure_server do |config|
|
117
|
+
config.logger = ::SemanticLogger[::Sidekiq]
|
118
|
+
if config.respond_to?(:options)
|
119
|
+
config.options[:job_logger] = RailsSemanticLogger::Sidekiq::JobLogger
|
120
|
+
else
|
121
|
+
config[:job_logger] = RailsSemanticLogger::Sidekiq::JobLogger
|
122
|
+
end
|
123
|
+
|
124
|
+
# Add back the default console logger unless already added
|
125
|
+
SemanticLogger.add_appender(io: $stdout, formatter: :color) unless SemanticLogger.appenders.console_output?
|
126
|
+
|
127
|
+
# Replace default error handler when present
|
128
|
+
existing = RailsSemanticLogger::Sidekiq::Defaults.delete_default_error_handler(config.error_handlers)
|
129
|
+
config.error_handlers << RailsSemanticLogger::Sidekiq::Defaults::ERROR_HANDLER if existing
|
130
|
+
end
|
131
|
+
|
132
|
+
if defined?(::Sidekiq::Job) && (::Sidekiq::VERSION.to_i != 5)
|
133
|
+
::Sidekiq::Job.singleton_class.prepend(RailsSemanticLogger::Sidekiq::Loggable)
|
134
|
+
else
|
135
|
+
::Sidekiq::Worker.singleton_class.prepend(RailsSemanticLogger::Sidekiq::Loggable)
|
117
136
|
end
|
118
137
|
end
|
119
138
|
|
@@ -154,7 +173,7 @@ module RailsSemanticLogger
|
|
154
173
|
|
155
174
|
if config.rails_semantic_logger.semantic
|
156
175
|
# Active Job
|
157
|
-
if defined?(::ActiveJob
|
176
|
+
if defined?(::ActiveJob::Logging::LogSubscriber)
|
158
177
|
RailsSemanticLogger.swap_subscriber(
|
159
178
|
::ActiveJob::Logging::LogSubscriber,
|
160
179
|
RailsSemanticLogger::ActiveJob::LogSubscriber,
|
@@ -162,7 +181,7 @@ module RailsSemanticLogger
|
|
162
181
|
)
|
163
182
|
end
|
164
183
|
|
165
|
-
if defined?(::ActiveJob
|
184
|
+
if defined?(::ActiveJob::LogSubscriber)
|
166
185
|
RailsSemanticLogger.swap_subscriber(
|
167
186
|
::ActiveJob::LogSubscriber,
|
168
187
|
RailsSemanticLogger::ActiveJob::LogSubscriber,
|
@@ -1,89 +1,14 @@
|
|
1
1
|
# Sidekiq patches
|
2
|
-
#
|
3
|
-
# To re-enable stdout logging for sidekiq server processes, add the following snippet to config/initializers/sidekiq.rb:
|
4
|
-
# Sidekiq.configure_server do |config|
|
5
|
-
# SemanticLogger.add_appender(io: $stdout, level: :debug, formatter: :color)
|
6
|
-
# end
|
7
2
|
if Sidekiq::VERSION.to_i == 4
|
8
|
-
require "sidekiq/exception_handler"
|
9
3
|
require "sidekiq/logging"
|
10
4
|
require "sidekiq/middleware/server/logging"
|
11
5
|
require "sidekiq/processor"
|
12
|
-
require "sidekiq/worker"
|
13
6
|
elsif Sidekiq::VERSION.to_i == 5
|
14
|
-
require "sidekiq/exception_handler"
|
15
|
-
require "sidekiq/job_logger"
|
16
7
|
require "sidekiq/logging"
|
17
|
-
require "sidekiq/worker"
|
18
|
-
elsif Sidekiq::VERSION.to_i == 6 && Sidekiq::VERSION.to_f < 6.5
|
19
|
-
require "sidekiq/exception_handler"
|
20
|
-
require "sidekiq/job_logger"
|
21
|
-
require "sidekiq/worker"
|
22
|
-
elsif Sidekiq::VERSION.to_i == 6
|
23
|
-
require "sidekiq/job_logger"
|
24
|
-
require "sidekiq/worker"
|
25
|
-
else
|
26
|
-
require "sidekiq/config"
|
27
|
-
require "sidekiq/job_logger"
|
28
|
-
require "sidekiq/job"
|
29
8
|
end
|
30
9
|
|
31
10
|
module Sidekiq
|
32
|
-
# Sidekiq
|
33
|
-
if defined?(::Sidekiq::JobLogger)
|
34
|
-
# Let Semantic Logger handle duration logging
|
35
|
-
class JobLogger
|
36
|
-
def call(item, queue, &block)
|
37
|
-
klass = item["wrapped"] || item["class"]
|
38
|
-
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
|
39
|
-
|
40
|
-
SemanticLogger.tagged(queue: queue) do
|
41
|
-
# Latency is the time between when the job was enqueued and when it started executing.
|
42
|
-
logger.info(
|
43
|
-
"Start #perform",
|
44
|
-
metric: "sidekiq.queue.latency",
|
45
|
-
metric_amount: job_latency_ms(item)
|
46
|
-
)
|
47
|
-
|
48
|
-
# Measure the duration of running the job
|
49
|
-
logger.measure_info(
|
50
|
-
"Completed #perform",
|
51
|
-
on_exception_level: :error,
|
52
|
-
log_exception: :full,
|
53
|
-
metric: "sidekiq.job.perform",
|
54
|
-
&block
|
55
|
-
)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def prepare(job_hash, &block)
|
60
|
-
level = job_hash["log_level"]
|
61
|
-
if level
|
62
|
-
SemanticLogger.silence(level) do
|
63
|
-
SemanticLogger.tagged(job_hash_context(job_hash), &block)
|
64
|
-
end
|
65
|
-
else
|
66
|
-
SemanticLogger.tagged(job_hash_context(job_hash), &block)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def job_hash_context(job_hash)
|
71
|
-
h = {jid: job_hash["jid"]}
|
72
|
-
h[:bid] = job_hash["bid"] if job_hash["bid"]
|
73
|
-
h[:tags] = job_hash["tags"] if job_hash["tags"]
|
74
|
-
h[:queue] = job_hash["queue"] if job_hash["queue"]
|
75
|
-
h
|
76
|
-
end
|
77
|
-
|
78
|
-
def job_latency_ms(job)
|
79
|
-
return unless job && job["enqueued_at"]
|
80
|
-
|
81
|
-
(Time.now.to_f - job["enqueued_at"].to_f) * 1000
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
# Sidekiq <= v6
|
11
|
+
# Sidekiq v4 & v5
|
87
12
|
if defined?(::Sidekiq::Logging)
|
88
13
|
# Replace Sidekiq logging context
|
89
14
|
module Logging
|
@@ -100,106 +25,8 @@ module Sidekiq
|
|
100
25
|
end
|
101
26
|
end
|
102
27
|
|
103
|
-
#
|
104
|
-
if defined?(::Sidekiq::ExceptionHandler)
|
105
|
-
# Sidekiq <= v6.5
|
106
|
-
module ExceptionHandler
|
107
|
-
class Logger
|
108
|
-
def call(_exception, ctx)
|
109
|
-
return if ctx.empty?
|
110
|
-
|
111
|
-
job_hash = ctx[:job] || {}
|
112
|
-
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
|
113
|
-
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
|
114
|
-
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|
118
|
-
elsif defined?(::Sidekiq::Config)
|
119
|
-
# Sidekiq >= v7
|
120
|
-
class Config
|
121
|
-
remove_const :ERROR_HANDLER
|
122
|
-
|
123
|
-
ERROR_HANDLER = ->(ex, ctx, cfg = Sidekiq.default_configuration) do
|
124
|
-
unless ctx.empty?
|
125
|
-
job_hash = ctx[:job] || {}
|
126
|
-
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
|
127
|
-
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
|
128
|
-
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
else
|
133
|
-
# Sidekiq >= 6.5
|
134
|
-
Sidekiq.error_handlers.delete(Sidekiq::DEFAULT_ERROR_HANDLER)
|
135
|
-
Sidekiq.error_handlers << ->(ex, ctx) do
|
136
|
-
unless ctx.empty?
|
137
|
-
job_hash = ctx[:job] || {}
|
138
|
-
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
|
139
|
-
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
|
140
|
-
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
# Logging within each worker should use its own logger
|
146
|
-
case Sidekiq::VERSION.to_i
|
147
|
-
when 4
|
148
|
-
module Worker
|
149
|
-
def self.included(base)
|
150
|
-
if base.ancestors.any? { |c| c.name == "ActiveJob::Base" }
|
151
|
-
raise ArgumentError, "You cannot include Sidekiq::Worker in an ActiveJob: #{base.name}"
|
152
|
-
end
|
153
|
-
|
154
|
-
base.extend(ClassMethods)
|
155
|
-
base.include(SemanticLogger::Loggable)
|
156
|
-
base.class_attribute :sidekiq_options_hash
|
157
|
-
base.class_attribute :sidekiq_retry_in_block
|
158
|
-
base.class_attribute :sidekiq_retries_exhausted_block
|
159
|
-
end
|
160
|
-
end
|
161
|
-
when 5
|
162
|
-
module Worker
|
163
|
-
def self.included(base)
|
164
|
-
if base.ancestors.any? { |c| c.name == "ActiveJob::Base" }
|
165
|
-
raise ArgumentError, "You cannot include Sidekiq::Worker in an ActiveJob: #{base.name}"
|
166
|
-
end
|
167
|
-
|
168
|
-
base.extend(ClassMethods)
|
169
|
-
base.include(SemanticLogger::Loggable)
|
170
|
-
base.sidekiq_class_attribute :sidekiq_options_hash
|
171
|
-
base.sidekiq_class_attribute :sidekiq_retry_in_block
|
172
|
-
base.sidekiq_class_attribute :sidekiq_retries_exhausted_block
|
173
|
-
end
|
174
|
-
end
|
175
|
-
when 6
|
176
|
-
module Worker
|
177
|
-
def self.included(base)
|
178
|
-
if base.ancestors.any? { |c| c.name == "ActiveJob::Base" }
|
179
|
-
raise ArgumentError, "Sidekiq::Worker cannot be included in an ActiveJob: #{base.name}"
|
180
|
-
end
|
181
|
-
|
182
|
-
base.include(Options)
|
183
|
-
base.extend(ClassMethods)
|
184
|
-
base.include(SemanticLogger::Loggable)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
else
|
188
|
-
module Job
|
189
|
-
def self.included(base)
|
190
|
-
if base.ancestors.any? { |c| c.name == "ActiveJob::Base" }
|
191
|
-
raise ArgumentError, "Sidekiq::Job cannot be included in an ActiveJob: #{base.name}"
|
192
|
-
end
|
193
|
-
|
194
|
-
base.include(Options)
|
195
|
-
base.extend(ClassMethods)
|
196
|
-
base.include(SemanticLogger::Loggable)
|
197
|
-
end
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
28
|
+
# Sidekiq v4
|
201
29
|
if defined?(::Sidekiq::Middleware::Server::Logging)
|
202
|
-
# Sidekiq v4
|
203
30
|
# Convert string to machine readable format
|
204
31
|
class Processor
|
205
32
|
def log_context(job_hash)
|
@@ -214,6 +41,7 @@ module Sidekiq
|
|
214
41
|
module Middleware
|
215
42
|
module Server
|
216
43
|
class Logging
|
44
|
+
# rubocop:disable Style/ExplicitBlockArgument
|
217
45
|
def call(worker, item, queue)
|
218
46
|
SemanticLogger.tagged(queue: queue) do
|
219
47
|
worker.logger.info(
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module RailsSemanticLogger
|
2
|
+
module Sidekiq
|
3
|
+
module Defaults
|
4
|
+
# Prevent exception logging during standard error handling since the Job Logger below already logs the exception.
|
5
|
+
ERROR_HANDLER =
|
6
|
+
if ::Sidekiq::VERSION.to_f < 7.1 ||
|
7
|
+
(::Sidekiq::VERSION.to_f == 7.1 && ::Sidekiq::VERSION.split(".").last.to_i < 6)
|
8
|
+
lambda do |_ex, ctx|
|
9
|
+
unless ctx.empty?
|
10
|
+
job_hash = ctx[:job] || {}
|
11
|
+
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
|
12
|
+
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
|
13
|
+
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
else
|
17
|
+
lambda do |_ex, ctx, _default_configuration|
|
18
|
+
unless ctx.empty?
|
19
|
+
job_hash = ctx[:job] || {}
|
20
|
+
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
|
21
|
+
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
|
22
|
+
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the default logger after removing from the supplied list.
|
28
|
+
# Returns [nil] when the default logger was not present.
|
29
|
+
def self.delete_default_error_handler(error_handlers)
|
30
|
+
return error_handlers.delete(::Sidekiq::Config::ERROR_HANDLER) if defined?(::Sidekiq::Config::ERROR_HANDLER)
|
31
|
+
return error_handlers.delete(::Sidekiq::DEFAULT_ERROR_HANDLER) if defined?(::Sidekiq::DEFAULT_ERROR_HANDLER)
|
32
|
+
|
33
|
+
return unless defined?(::Sidekiq::ExceptionHandler)
|
34
|
+
|
35
|
+
existing = error_handlers.find { |handler| handler.is_a?(::Sidekiq::ExceptionHandler::Logger) }
|
36
|
+
error_handlers.delete(existing) if existing
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module RailsSemanticLogger
|
2
|
+
module Sidekiq
|
3
|
+
class JobLogger
|
4
|
+
# Sidekiq 6.5 does not take any arguments, whereas v7 is given a logger
|
5
|
+
def initialize(*_args)
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(item, queue, &block)
|
9
|
+
klass = item["wrapped"] || item["class"]
|
10
|
+
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
|
11
|
+
|
12
|
+
SemanticLogger.tagged(queue: queue) do
|
13
|
+
# Latency is the time between when the job was enqueued and when it started executing.
|
14
|
+
logger.info(
|
15
|
+
"Start #perform",
|
16
|
+
metric: "sidekiq.queue.latency",
|
17
|
+
metric_amount: job_latency_ms(item)
|
18
|
+
)
|
19
|
+
|
20
|
+
# Measure the duration of running the job
|
21
|
+
logger.measure_info(
|
22
|
+
"Completed #perform",
|
23
|
+
on_exception_level: :error,
|
24
|
+
log_exception: :full,
|
25
|
+
metric: "sidekiq.job.perform",
|
26
|
+
&block
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def prepare(job_hash, &block)
|
32
|
+
level = job_hash["log_level"]
|
33
|
+
if level
|
34
|
+
SemanticLogger.silence(level) do
|
35
|
+
SemanticLogger.tagged(job_hash_context(job_hash), &block)
|
36
|
+
end
|
37
|
+
else
|
38
|
+
SemanticLogger.tagged(job_hash_context(job_hash), &block)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def job_hash_context(job_hash)
|
45
|
+
h = {jid: job_hash["jid"]}
|
46
|
+
h[:bid] = job_hash["bid"] if job_hash["bid"]
|
47
|
+
h[:tags] = job_hash["tags"] if job_hash["tags"]
|
48
|
+
h[:queue] = job_hash["queue"] if job_hash["queue"]
|
49
|
+
h
|
50
|
+
end
|
51
|
+
|
52
|
+
def job_latency_ms(job)
|
53
|
+
return unless job && job["enqueued_at"]
|
54
|
+
|
55
|
+
(Time.now.to_f - job["enqueued_at"].to_f) * 1000
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -31,6 +31,12 @@ module RailsSemanticLogger
|
|
31
31
|
autoload :Plugin, "rails_semantic_logger/delayed_job/plugin"
|
32
32
|
end
|
33
33
|
|
34
|
+
module Sidekiq
|
35
|
+
autoload :Defaults, "rails_semantic_logger/sidekiq/defaults"
|
36
|
+
autoload :JobLogger, "rails_semantic_logger/sidekiq/job_logger"
|
37
|
+
autoload :Loggable, "rails_semantic_logger/sidekiq/loggable"
|
38
|
+
end
|
39
|
+
|
34
40
|
autoload :Options, "rails_semantic_logger/options"
|
35
41
|
|
36
42
|
# Swap an existing subscriber with a new one
|
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.17.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: 2024-07-
|
11
|
+
date: 2024-07-05 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.16'
|
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.16'
|
55
55
|
description:
|
56
56
|
email:
|
57
57
|
executables: []
|
@@ -85,6 +85,9 @@ files:
|
|
85
85
|
- lib/rails_semantic_logger/extensions/sidekiq/sidekiq.rb
|
86
86
|
- lib/rails_semantic_logger/options.rb
|
87
87
|
- lib/rails_semantic_logger/rack/logger.rb
|
88
|
+
- lib/rails_semantic_logger/sidekiq/defaults.rb
|
89
|
+
- lib/rails_semantic_logger/sidekiq/job_logger.rb
|
90
|
+
- lib/rails_semantic_logger/sidekiq/loggable.rb
|
88
91
|
- lib/rails_semantic_logger/version.rb
|
89
92
|
homepage: https://logger.rocketjob.io
|
90
93
|
licenses:
|
@@ -92,7 +95,7 @@ licenses:
|
|
92
95
|
metadata:
|
93
96
|
bug_tracker_uri: https://github.com/reidmorrison/rails_semantic_logger/issues
|
94
97
|
documentation_uri: https://logger.rocketjob.io
|
95
|
-
source_code_uri: https://github.com/reidmorrison/rails_semantic_logger/tree/v4.
|
98
|
+
source_code_uri: https://github.com/reidmorrison/rails_semantic_logger/tree/v4.17.0
|
96
99
|
rubygems_mfa_required: 'true'
|
97
100
|
post_install_message:
|
98
101
|
rdoc_options: []
|