Журналы Sidekiq показывают JobWrapper вместо имени класса задания

#ruby-on-rails #ruby #redis #sidekiq #rails-activejob

#ruby-on-rails #ruby #redis #sidekiq #rails-activejob

Вопрос:

У меня есть приложение Rails, которое запускает некоторые фоновые задания через ActiveJob и Sidekiq. Журналы sidekiq как в терминале, так и в файле журнала показывают следующее:

 2016-10-18T06:17:01.911Z 3252 TID-oukzs4q3k ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper JID-97318b38b1391672d21feb93 INFO: start
  

Есть ли какой-нибудь способ показать имена классов заданий здесь аналогично тому, как журналы работают для обычного работника Sidekiq?

Обновить:

Вот как регистрируется рабочий Sidekiq:

 2016-10-18T11:05:39.690Z 13678 TID-or4o9w2o4 ClientJob JID-b3c71c9c63fe0c6d29fd2f21 INFO: start
  

Обновление 2:

Моя версия sidekiq 3.4.2

Я бы хотел заменить ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper на Client Job

Ответ №1:

Итак, мне удалось сделать это, удалив Sidekiq::Middleware::Server::Logging из конфигурации промежуточного программного обеспечения и добавив модифицированный класс, который отображает аргументы в журналах. Сами аргументы также содержат имена заданий и действий.

Для последней версии, в настоящее 4.2.3 время, в sidekiq.rb

 require 'sidekiq'
require 'sidekiq/middleware/server/logging'

class ParamsLogging < Sidekiq::Middleware::Server::Logging
  def log_context(worker, item)
    klass = item['wrapped'.freeze] || worker.class.to_s
    "#{klass} (#{item['args'].try(:join, ' ')}) JID-#{item['jid'.freeze]}"
  end
end

Sidekiq.configure_server do |config|
  config.server_middleware do |chain|
    chain.remove Sidekiq::Middleware::Server::Logging
    chain.add ParamsLogging
  end
end
  

Для версии 3.4.2 или аналогичной переопределите call метод вместо:

 class ParamsLogging < Sidekiq::Middleware::Server::Logging
  def call(worker, item, queue)
    klass = item['wrapped'.freeze] || worker.class.to_s
    Sidekiq::Logging.with_context("#{klass} (#{item['args'].try(:join, ' ')}) JID-#{item['jid'.freeze]}") do
      begin
        start = Time.now
        logger.info { "start" }
        yield
        logger.info { "done: #{elapsed(start)} sec" }
      rescue Exception
        logger.info { "fail: #{elapsed(start)} sec" }
        raise
      end
    end
  end
end
  

Комментарии:

1. Я пока воздержусь от принятия этого ответа, поскольку хотел бы увидеть лучший подход.

Ответ №2:

Должно быть, вы используете какую-то древнюю версию. Обновление.

Извините, похоже, что это только функция Rails 5 . Вам нужно будет обновить Rails. https://github.com/rails/rails/commit/8d2b1406bc201d8705e931b6f043441930f2e8ac

Комментарии:

1. Я обновился до последней версии, и результат остался прежним. Имя класса по-прежнему оценивается ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper как . В любом случае, есть ли какой-либо способ отображения имени задания при сохранении старой версии (3.4.2)?