在Rails服务器日志中查看Resque日志输出

3
我有一个运行在Puma服务器上的Rails 4应用程序,使用Resque / Resque-Scheduler运行后台作业。我想知道如何将两个Resque工作者的日志输出合并到我的服务器日志中,或者如果不可能,则如何查看我的Resque工作者的日志输出。目前,我无法找出如何查看工作者的日志输出,因此我不知道内部发生了什么。我发现这篇博客文章,建议将以下内容添加到我的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

这并没有起作用。我还尝试了评论中的建议,即将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日志文档,但由于我对Rails中的日志记录并不了解,所以不确定如何使用其中的内容。我在这个主题上没有找到其他有用的资源。


你解决了这个问题吗? - FutoRicky
有点像。我注意到一段时间以前,Resque和Resque Scheduler的日志被输出到我的Heroku主服务器日志中,但我从来没有找出是什么触发了这种行为(主要是因为我现在没有时间投入其中)。我怀疑这可能是因为我将Rails日志输出从“info”增加到“debug”,和/或者因为我从Rails 4.0.2升级到了4.2.5。这只改变了Heroku上的日志输出,但这也是我最初提出问题的原因。在本地主机上,我仍然需要单独查看每个进程的日志。 - Daniel Bonnell
3个回答

5

我如何解决它,虽然不是完美的,但它起作用了。

我的环境: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中什么都看不到。

有人说应该始终设置日志文件同步,无缓冲区,所以我根据stackoverflow上面的一个问题更新了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 中得到我想要的内容。你可以尝试一下。

1

我遇到了同样的问题,所以我检查了resque的源代码,最终在初始化过程中需要执行以下步骤:

  1. 定义日志格式。
  2. 然后使用日志文件路径定义记录器。
  3. 设置任何日志级别。

这里是在Rails情况下我的config/initializers/resque.rb的示例:

...
Resque.logger           = Logger.new("#{Rails.root}/log/resque.log")
Resque.logger.level     = Logger::DEBUG
Resque.logger.formatter = ::Logger::Formatter.new   # This is important

Resque默认的日志格式设置在这里,其定义在这里。显然它只是忽略了输出...


0

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

Resque.before_fork do
  # Your code here
end

看起来before_fork接受一个块作为参数,而不是分配一个块给它。


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