Skip to content

Commit 370e049

Browse files
committed
Handle Sidekiq v7.2 changes
1 parent 121464a commit 370e049

File tree

4 files changed

+48
-34
lines changed

4 files changed

+48
-34
lines changed

Diff for: lib/rails_semantic_logger.rb

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ module DelayedJob
3232
end
3333

3434
module Sidekiq
35+
autoload :Defaults, "rails_semantic_logger/sidekiq/defaults"
3536
autoload :JobLogger, "rails_semantic_logger/sidekiq/job_logger"
3637
autoload :Loggable, "rails_semantic_logger/sidekiq/loggable"
3738
end

Diff for: lib/rails_semantic_logger/engine.rb

+3-34
Original file line numberDiff line numberDiff line change
@@ -123,40 +123,9 @@ class Engine < ::Rails::Engine
123123

124124
SemanticLogger.add_appender(io: $stdout, formatter: :color) unless SemanticLogger.appenders.console_output?
125125

126-
# Replace default error handler if present
127-
# Prevent exception logging since the Job Logger already logged the exception.
128-
# Only log the context that was not available during the job_logger call.
129-
if defined?(::Sidekiq::ExceptionHandler)
130-
existing = ::Sidekiq.error_handlers.find { |handler| handler.is_a?(::Sidekiq::ExceptionHandler::Logger) }
131-
if existing && config.error_handlers.delete(existing)
132-
config.error_handlers << ->(ex, ctx) do
133-
unless ctx.empty?
134-
job_hash = ctx[:job] || {}
135-
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
136-
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
137-
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
138-
end
139-
end
140-
end
141-
elsif defined?(::Sidekiq::DEFAULT_ERROR_HANDLER) && config.error_handlers.delete(::Sidekiq::DEFAULT_ERROR_HANDLER)
142-
config.error_handlers << ->(ex, ctx) do
143-
unless ctx.empty?
144-
job_hash = ctx[:job] || {}
145-
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
146-
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
147-
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
148-
end
149-
end
150-
elsif defined?(::Sidekiq::Config::ERROR_HANDLER) && config.error_handlers.delete(::Sidekiq::Config::ERROR_HANDLER)
151-
config.error_handlers << ->(ex, ctx, _default_configuration) do
152-
unless ctx.empty?
153-
job_hash = ctx[:job] || {}
154-
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
155-
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
156-
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
157-
end
158-
end
159-
end
126+
# Replace default error handler when present
127+
existing = RailsSemanticLogger::Sidekiq::Defaults.delete_default_error_handler(config.error_handlers)
128+
config.error_handlers << RailsSemanticLogger::Sidekiq::Defaults::ERROR_HANDLER if existing
160129
end
161130

162131
if defined?(::Sidekiq::Job)

Diff for: lib/rails_semantic_logger/sidekiq/defaults.rb

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
if ::Sidekiq::VERSION.to_f < 7.2
6+
ERROR_HANDLER = ->(ex, ctx) do
7+
unless ctx.empty?
8+
job_hash = ctx[:job] || {}
9+
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
10+
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
11+
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
12+
end
13+
end
14+
else
15+
ERROR_HANDLER = ->(ex, ctx, _default_configuration) do
16+
unless ctx.empty?
17+
job_hash = ctx[:job] || {}
18+
klass = job_hash["display_class"] || job_hash["wrapped"] || job_hash["class"]
19+
logger = klass ? SemanticLogger[klass] : Sidekiq.logger
20+
ctx[:context] ? logger.warn(ctx[:context], ctx) : logger.warn(ctx)
21+
end
22+
end
23+
end
24+
25+
# Returns the default logger after removing from the supplied list.
26+
# Returns [nil] when the default logger was not present.
27+
def self.delete_default_error_handler(error_handlers)
28+
return error_handlers.delete(::Sidekiq::Config::ERROR_HANDLER) if defined?(::Sidekiq::Config::ERROR_HANDLER)
29+
return error_handlers.delete(::Sidekiq::DEFAULT_ERROR_HANDLER) if defined?(::Sidekiq::DEFAULT_ERROR_HANDLER)
30+
31+
return unless defined?(::Sidekiq::ExceptionHandler)
32+
existing = error_handlers.find { |handler| handler.is_a?(::Sidekiq::ExceptionHandler::Logger) }
33+
return config.error_handlers.delete(existing) if existing
34+
end
35+
end
36+
end
37+
end

Diff for: test/dummy/config/initializers/sidekiq.rb

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# In tests we force Sidekiq into thinking it is running as a server,
2+
# so it creates a stdout logger. Remove it here:
3+
Rails.application.config.after_initialize do
4+
if Rails.env.test?
5+
SemanticLogger.appenders.delete_if { |appender| appender.is_a?(SemanticLogger::Appender::IO) }
6+
end
7+
end

0 commit comments

Comments
 (0)