【问题标题】:View Resque log output in Rails server logs在 Rails 服务器日志中查看 Resque 日志输出
【发布时间】:2015-11-16 14:53:12
【问题描述】:

我在 Puma 服务器上有一个 Rails 4 应用程序,Resque/Resque-Scheduler 运行后台作业。我想知道的是如何将我的两个 Resque 工作人员的日志输出合并到我的服务器日志中,或者,这是不可能的,我如何查看我的 Resque 工作人员的日志输出。目前我还无法弄清楚如何查看工作人员的日志输出,所以我不知道幕后发生了什么。我找到了this blogpost,它建议在我的resque.rake 文件中添加以下喜欢:

task "resque:setup" => :environment do
  Resque.before_fork = Proc.new { 
    ActiveRecord::Base.establish_connection

    # Open the new separate log file
    logfile = File.open(File.join(Rails.root, 'log', 'resque.log'), 'a')

    # Activate file synchronization
    logfile.sync = true

    # Create a new buffered logger
    Resque.logger = ActiveSupport::BufferedLogger.new(logfile)
    Resque.logger.level = Logger::INFO
    Resque.logger.info "Resque Logger Initialized!"
  }
end

那没用。我还尝试了 cmets 中的建议,即将Resque.logger = ActiveSupport::BufferedLogger.new(logfile) 替换为Resque.logger = ActiveSupport::Logger.new(logfile),但这也不起作用。使用第二个选项时,当我尝试启动工作程序时,我仍然会收到 NoMethodError: undefined method 'logger=' for Resque:Module 错误。

这是我当前的resque.rake 文件:

require 'resque/tasks'
require 'resque_scheduler/tasks'

namespace :resque do
    puts "Loading Rails environment for Resque"
    task :setup => :environment do
        require 'resque'
        require 'resque_scheduler'
        require 'resque/scheduler'
        require 'postman'
    end
end

我查看了Resque docs on logging,但不确定如何使用那里的内容,因为我承认对登录 Rails 不太了解。我没有找到有关该主题的其他有用资源。

【问题讨论】:

  • 你解决过这个问题吗?
  • 有点。不久前,我注意到来自 Resque 和 Resque Scheduler 的日志正在输出到我在 Heroku 上的主服务器日志,但我从未弄清楚(主要是因为我现在没有时间投入其中)是什么触发了变化行为。我怀疑这可能是因为我将 Rails 日志输出从 info 增加到 debug 和/或因为我从 Rails 4.0.2 升级到了 4.2.5。这仅更改了 Heroku 上的日志输出,但这就是我最初提出问题的原因。在 localhost 上,我仍然需要单独查看每个进程的日志。

标签: ruby-on-rails ruby-on-rails-4 logging resque resque-scheduler


【解决方案1】:

我如何解决它,它并不完美,但可以正常工作。

我的环境:rails 5.0.1,resque:1.26.0

第一次,我按照大多数文档的建议在config/initializers/resque.rb 中设置了Resque.loggerResque.logger.level

# config/initializers/resque.rb
Resque.logger = Logger.new("#{Rails.root}/log/resque.log")
Resque.logger.level = Logger::DEBUG

然后在工作中,我通过Resque.logger.info输出日志:

# update_xxx_job.rb
class UpdateXxxJob
  def self.perform
    Resque.logger.info 'Job starts'
    ...
  end
end

它不起作用,我在log/resque.log 中什么都看不到。

然后有人说应该始终设置日志文件同步,没有缓冲区,所以我根据a question from *更新config/initializers/resque.rb

# config/initializers/resque.rb
logfile = File.open(File.join(Rails.root, 'log', 'resque.log'), 'a')
logfile.sync = true
Resque.logger = ActiveSupport::Logger.new(logfile)
Resque.logger.level = Logger::INFO

还是不行。

我还尝试在lib/tasks/resque.rake 中配置 resque 记录器:

# lib/tasks/resque.rake
require 'resque'
require 'resque/tasks'
require 'resque/scheduler/tasks'
require 'resque-scheduler'
require 'resque/scheduler/server'

namespace :resque do
  task setup: :environment do
    Resque.schedule = YAML.load_file(Rails.root + "config/resque_scheduler_#{Rails.env}.yml")

    Resque.redis.namespace = "xxx_#{Rails.env}"

    Resque.logger = Logger.new("#{Rails.root}/log/resque.log")
    Resque.logger.level = Logger::INFO
  end
end

没用。

最后,我决定将记录器配置从初始化程序移到作业中,因此作业现在看起来像:

# update_xxx_job.rb
class UpdateXxxJob
  def self.perform
    Resque.logger = Logger.new("#{Rails.root}/log/resque.log")
    Resque.logger.level = Logger::DEBUG   

    Resque.logger.info 'Job starts'
    ...
  end
end

然后我可以在log/resque.log 中得到我想要的。

你可以试试。

【讨论】:

    【解决方案2】:

    我在设置时遇到了同样的问题。这是我所做的:

    Resque.before_fork do
      # Your code here
    end
    

    似乎before_fork 接受一个块作为参数,而不是为其分配一个块。

    【讨论】: