3

我们在项目中使用了delayed_job 的命名队列。有没有办法将每个队列记录到单独的日志文件中?

DelayedJob 在部署脚本中启动,如下所示:

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/delayaed_job.production.log

4

3 回答 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
于 2013-10-22T06:53:58.863 回答
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"
于 2013-10-21T06:44:31.557 回答
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
于 2019-04-22T09:01:03.487 回答