Sidekiq日志显示JobWrapper而不是Job类名

时间:2016-10-18 11:07:41

标签: 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

2 个答案:

答案 0 :(得分:0)

你必须运行一些古老的版本。升级。

抱歉,看起来只是Rails 5+功能。您需要升级Rails。 https://github.com/rails/rails/commit/8d2b1406bc201d8705e931b6f043441930f2e8ac

答案 1 :(得分:0)

所以我设法通过从中间件配置中删除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