Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rails Error: Unable to access log file #3

Open
leifbladt opened this issue Apr 8, 2011 · 5 comments
Open

Rails Error: Unable to access log file #3

leifbladt opened this issue Apr 8, 2011 · 5 comments

Comments

@leifbladt
Copy link

I have a Rails 3 application which uses delayed_job as job queue. When I use clockwork with the following configuration, I get an error that the rails process can't access the log file.

require File.expand_path('../config/environment', File.dirname(__FILE__))
every(60.seconds, 'check') { Delayed::Job.enqueue(SchedulerJob.new) }
Rails Error: Unable to access log file. Please ensure that  exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.

I already checked the permissions of the log file.

Versions used:
Rails 3.0.5
Ruby 1.9.2-p136
delayed_job 2.1.4
clockwork 0.2.3

@sdhull
Copy link

sdhull commented May 20, 2011

Yeah this was bugging me to. I suspect it has something to do with the fact that ever since Ruby 1.9, the ruby interpreter doesn't seem to set pwd properly (for me, anyway). So for example, if I want to run tests, I have to do something like this:
ruby -I . test/some_test.rb
It's very annoying. Anyway so I think the issue is that Ruby doesn't know that pwd = Rails.root when you simply run your clock.rb file. I solved this personally by created a rake task (since loading your environment in rake knows how to write to your log file), that pretty much does the same thing as running clockwork clock.rb. For a bonus, I daemonize it, save the pid, and created rake tasks for start, stop, and restart. Check it out: https://gist.github.com/938386

Enjoy. :)

@juno
Copy link

juno commented Jun 29, 2011

I had same error on ruby 1.9.2p180 & rails 3.0.9.
I think that this error caused by naming conflicts of log method.

bin/clockwork includes Clockwork module into top-level namespace, thus, log method call will invoke Clockwork::log(msg) instead of rails expects.

So, if Rails.root/clock.rb loads Rails environment likes this:

require './config/boot'
require './config/environment'

handler { |job| puts "Process #{job}" }
every(1.hour, 'Dummy job')

conflicts and exception occures. this is backtrace:

/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/clockwork-0.2.3/lib/clockwork.rb:85:in `log'
/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/railties-3.0.9/lib/rails/application/bootstrap.rb:29:in `block in <module:Bootstrap>'
/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/railties-3.0.9/lib/rails/initializable.rb:25:in `instance_exec'
/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/railties-3.0.9/lib/rails/initializable.rb:25:in `run'/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/railties-3.0.9/lib/rails/initializable.rb:50:in `block in run_initializers'/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/railties-3.0.9/lib/rails/initializable.rb:49:in `each'
/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/railties-3.0.9/lib/rails/initializable.rb:49:in `run_initializers'/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/railties-3.0.9/lib/rails/application.rb:134:in `initialize!'
/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/railties-3.0.9/lib/rails/application.rb:77:in `method_missing'
/Users/juno/tmp/clockworkapp/config/environment.rb:5:in `<top (required)>'
/Users/juno/tmp/clockworkapp/clock.rb:2:in `require_relative'
/Users/juno/tmp/clockworkapp/clock.rb:2:in `<top (required)>'
/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/clockwork-0.2.3/bin/clockwork:13:in `require'/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/gems/clockwork-0.2.3/bin/clockwork:13:in `<top (required)>'
/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/bin/clockwork:19:in `load'
/Users/juno/.rvm/gems/ruby-1.9.2-p180@clockworkapp/bin/clockwork:19:in `<main>'
Rails Error: Unable to access log file. Please ensure that  exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.

I solved this problems with renaming Clockwork::log.

--- clockwork.rb.orig   2011-06-29 17:59:38.000000000 +0900
+++ clockwork.rb    2011-06-29 18:00:08.000000000 +0900
@@ -75,14 +75,14 @@
    end

    def run
-       log "Starting clock for #{@@events.size} events: [ " + @@events.map { |e| e.to_s }.join(' ') + " ]"
+       log2 "Starting clock for #{@@events.size} events: [ " + @@events.map { |e| e.to_s }.join(' ') + " ]"
        loop do
            tick
            sleep 1
        end
    end

-   def log(msg)
+   def log2(msg)
        puts msg
    end

@@ -92,7 +92,7 @@
        end

        to_run.each do |event|
-           log "Triggering #{event}"
+           log2 "Triggering #{event}"
            event.run(t)
        end

Hope this helps.

@lexer
Copy link

lexer commented Aug 9, 2011

Any updates for this issue?

@lukaskonarovsky
Copy link
Contributor

Another solution may be inserting directly jobs into DJ database table and thus not need to load whole Rails env.

Example for postgres:

# clock.rb
require 'pg'
require 'yaml'
db = YAML.load_file(File.dirname(__FILE__) + "/database.yml")[ENV['RAILS_ENV'] || "development"]
conn = PGconn.connect(db['host'], nil, nil, nil, db['database'], db['username'], db['password'])

require 'clockwork'
include Clockwork


handler do |job|
  db_time = Time.now.utc.strftime("%Y-%m-%d %H:%M:%S")
  handler = "--- !ruby/object:ScheduledJob \njob: #{job}\n"
  conn.exec("INSERT INTO \"delayed_jobs\" (\"failed_at\", \"locked_by\", \"created_at\", \"handler\", \"updated_at\", \"priority\", \"run_at\", \"attempts\", \"locked_at\", \"last_error\") VALUES(NULL, NULL, '#{db_time}', '#{handler}', '#{db_time}', 0, '#{db_time}', 0, NULL, NULL)")
end

every(30.minutes, 'reactivate_paid_accounts')

@nevinera
Copy link

If anybody else is having issues with this, I have a simpler solution for you:

# lib/tasks/clock.rake

task "clock" => :environment do
  STDERR.sync = STDOUT.sync = true
  require 'clockwork'   #notice: not including, just requiring

  Clockwork.every 5.seconds, 'do-some-task' do
    puts "TEST - 5 seconds have passed"
  end

  Clockwork.run
end

Now instead of adding clockwork clock.rb to your procfile in some form, you add rake clock.
This avoids the namespacing collision and keeps you from having to reload your rails environment every tick.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants