【问题标题】:Separate logs for delayed_job named queuesdelay_job 命名队列的单独日志
【发布时间】:2013-10-15 10:01:57
【问题描述】:

我们在项目中使用了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

【问题讨论】:

    标签: ruby-on-rails ruby delayed-job


    【解决方案1】:

    不幸的是,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
    

    【讨论】:

    • 好吧,谢谢你的赏金。很抱歉我的解决方案没有帮助,但无论如何都很好地解决了这个问题!
    【解决方案2】:

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

    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"
    

    【讨论】:

      【解决方案3】:

      在最新的 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
      

      【讨论】:

        猜你喜欢
        • 2011-01-26
        • 2018-07-27
        • 2014-08-21
        • 2010-10-15
        • 2011-07-06
        • 1970-01-01
        • 2019-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多