Search code examples
ruby-on-railsrubydelayed-job

Separate logs for delayed_job named queues


We're using delayed_job's named queues in our project. Is there any way to log each queue into separate log file?

DelayedJob in started in deploy script like this:

run "cd #{current_path};RAILS_ENV=#{rails_env} script/delayed_job -p #{rails_env} -i 1 --queue=fast start"
run "cd #{current_path};RAILS_ENV=#{rails_env} script/delayed_job -p #{rails_env} -i 2 start"

What I'd like to achieve is that everything running in fast queue would log into log/delayed_job.fast.production.log, and everything in the other queue would log into log/delayaed_job.production.log.


Solution

  • Unfortunately, the answer by jvperrin didn't help. What we've managed to do is to set the needed log file in initializer:

    Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/delayed_job.#{Rails.env}.log", Rails.logger.level)
    
    if caller.last =~ /script\/delayed_job/
      queues = ARGV.select { |opt| opt =~ /--queue=/ }
      queue = /\=(.*)/.match(queues.first) if queues
      queue = $1 if queue
    
      if queue
        Delayed::Worker.logger = ActiveSupport::BufferedLogger.new("log/delayed_job.#{queue}.#{Rails.env}.log", Rails.logger.level)
      end
    
      ActiveRecord::Base.logger = Delayed::Worker.logger
      Rails.logger = Delayed::Worker.logger
    end