延迟任务队列的日志分离

3
我们的项目中使用了delayed_job的命名队列。有没有办法将每个队列记录到单独的日志文件中?
在部署脚本中,delayed_job是这样启动的:
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"

我想实现的是,运行在fast队列中的所有内容都将记录在log/delayed_job.fast.production.log中,而其他队列中的内容则记录在log/delayed_job.production.log中。
3个回答

3

很不幸,jvperrin的答案并没有帮助。我们所做的是在初始化器中设置所需的日志文件:

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

非常感谢您的慷慨奖励。很抱歉我的解决方案没有帮到您,但是您能够成功地找到解决方法真的很棒! - jvperrin

1

尝试用以下两个命令替换您的部署脚本中的两个命令:

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

我在第一个命令的末尾添加了>> ./log/delayed_job.fast.production.log 2>&1,在第二个命令的末尾添加了>> ./log/delayed_job.production.log 2>&1。这些添加的部分将把delayed_job命令的输出重定向到每个日志文件的stdout和stderr。输出可能不会立即写入文件,可能是因为有某种缓冲区用于文件写入。
如果您希望输出继续显示在屏幕上并记录到文件中,则可以使用tee命令:
run "cd #{current_path};RAILS_ENV=#{rails_env} script/delayed_job -p #{rails_env} -i 1 --queue=fast start | tee -a ./log/delayed_job.fast.production.log 2>&1"
run "cd #{current_path};RAILS_ENV=#{rails_env} script/delayed_job -p #{rails_env} -i 2 start | tee -a ./log/delayed_job.production.log 2>&1"

0
在最新的Rails版本中使用(基于Paul Nosoff的答案):
if caller.last =~ /bin\/delayed_job/

  queues = ARGV.select { |opt| opt =~ /--queue=/ }
  queue = /\=(.*)/.match(queues.first) if queues
  queue = $1 if queue

  if queue
    log_file_name = Rails.root.join('log', "delayed_job.#{queue}.#{Rails.env}.log")
  else
    log_file_name = Rails.root.join('log', 'delayed_job.log')
  end
  # Daily log rotate, Debug level:
  logger = ActiveSupport::Logger.new(log_file_name, 'daily', level: Logger::DEBUG)
  Rails.logger = ActiveRecord::Base.logger = Delayed::Worker.logger = logger
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接