我在Puma服务器上安装了Rails 4应用程序,Resque / Resque-Scheduler运行后台作业。我想知道的是我如何将我的两个Resque worker的日志输出合并到我的服务器日志中,或者,这是不可能的,我如何查看我的Resque worker的日志输出。目前我还没有弄清楚如何查看工人的日志输出,所以我不知道发生了什么。我找到了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
那不起作用。我还在评论中尝试了这个建议,即将Resque.logger = ActiveSupport::BufferedLogger.new(logfile)
替换为Resque.logger = ActiveSupport::Logger.new(logfile)
,但这也没有用。使用第二个选项,当我尝试启动一个worker时,我仍然遇到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。我还没有找到关于这个主题的其他有用资源。
答案 0 :(得分:1)
我如何解决它,它并不完美但只是有效。
我的环境:rails 5.0.1,resque:1.26.0
第一次,我在Resque.logger
中设置了Resque.logger.level
和config/initializers/resque.rb
,正如大多数文档所暗示的那样:
# 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 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 :(得分:0)
我在设置我时遇到了同样的问题。这是我做的:
Resque.before_fork do
# Your code here
end
似乎before_fork
接受一个块作为参数,而不是为它分配一个块。