From fe5bfc8d3bd6bafdb45a4b44183433ccf1aef53b Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 16:28:20 +0000 Subject: [PATCH] DEV: Route Sidekiq logs to Rails logger (#15817) Most of our logging goes through Rails.logger, and therefore appears in Logster at `/logs` on a site. The Sidekiq logger was bypassing this and writing directly to STDERR. Unfortunately it's not possible to do `Sidekiq.logger = Rails.logger` because `Sidekiq#logger=` applies a number of patches to the logger instance, causing our whole logging system to break. Instead, this commit adds a dedicated Logger instance with no output, which is then patched to forward all messages directly to `Rails.logger` --- config/initializers/100-sidekiq.rb | 16 +++++++++++----- lib/demon/sidekiq.rb | 5 ----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/config/initializers/100-sidekiq.rb b/config/initializers/100-sidekiq.rb index b309e45123..99d9da4cfd 100644 --- a/config/initializers/100-sidekiq.rb +++ b/config/initializers/100-sidekiq.rb @@ -81,7 +81,16 @@ if Sidekiq.server? end end -Sidekiq.logger = Sidekiq::Logger.new(STDERR, level: Logger::WARN) +# Sidekiq#logger= applies patches to whichever logger we pass it. +# Therefore something like Sidekiq.logger = Rails.logger will break +# all logging in the application. +# +# Instead, this patch adds a dedicated logger instance and patches +# the #add method to forward messages to Rails.logger. +Sidekiq.logger = Logger.new(nil) +Sidekiq.logger.define_singleton_method(:add) do |severity, message = nil, progname = nil, &blk| + Rails.logger.add(severity, message, progname, &blk) +end class SidekiqLogsterReporter < Sidekiq::ExceptionHandler::Logger def call(ex, context = {}) @@ -111,8 +120,5 @@ class SidekiqLogsterReporter < Sidekiq::ExceptionHandler::Logger end end -unless Rails.env.development? - Sidekiq.error_handlers.clear -end - +Sidekiq.error_handlers.clear Sidekiq.error_handlers << SidekiqLogsterReporter.new diff --git a/lib/demon/sidekiq.rb b/lib/demon/sidekiq.rb index b8d418f928..ed7556d299 100644 --- a/lib/demon/sidekiq.rb +++ b/lib/demon/sidekiq.rb @@ -27,11 +27,6 @@ class Demon::Sidekiq < ::Demon::Base puts "Loading Sidekiq in process id #{Process.pid}" require 'sidekiq/cli' - # CLI will close the logger, if we have one set we can be in big - # trouble, if STDOUT is closed in our process all sort of weird - # will ensue, resetting the logger ensures it will reinit correctly - # parent process is in charge of the file anyway. - Sidekiq.logger = Sidekiq::Logger.new(STDERR, level: Logger::WARN) cli = Sidekiq::CLI.instance # Unicorn uses USR1 to indicate that log files have been rotated