журнал не работает в производстве с отложенной работой - PullRequest
2 голосов
/ 04 февраля 2010

У меня странная проблема, из-за которой мои delayed_jobs не работают. Наконец я сузил его до регистратора. Если я закомментирую свои вызовы функции журнала, все работает. Однако, если я пытаюсь войти, я получаю это в обработчике delayed_job:

 --- !ruby/struct:Delayed::PerformableMethod 
object: AR:User:1
method: :load_and_update_without_send_later
args: []

 | closed stream
/opt/ruby/lib/ruby/1.8/logger.rb:504:in `write'
/opt/ruby/lib/ruby/1.8/logger.rb:504:in `write'
/opt/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'
/opt/ruby/lib/ruby/1.8/logger.rb:496:in `write'
/opt/ruby/lib/ruby/1.8/logger.rb:326:in `add'
/opt/ruby/lib/ruby/1.8/logger.rb:374:in `info'
/home/rails/myapp.com/releases/20100203203031/app/models/gmail.rb:35:in `log'

Мой логгер выглядит так:

@@error_log_file = File.open("#{RAILS_ROOT}/log/error.log", 'a')
@@error_log_file.sync = true
def log(msg)
  msg.each do |line|
    line = "#{Time.now.strftime('%H:%M:%S')}  #{line}"
    @@error_log_file.info(line) # this is line 35 where it's failing
    puts line
  end
end

Если я закомментирую строку "@@ error_log_file.sync = true", это также сработает.

Это проблема с отложенным заданием, или это может быть связано с тем, что мой каталог журналов является символической ссылкой (как установлено стандартным развертыванием capistrano)?

Также в мой файл error.log ничего не записывается, а в delayed_job.log ничего не пишется. Совершенно в тупик ...

Ответы [ 3 ]

5 голосов
/ 11 февраля 2010

Вуди Петерсон обнаружил проблему здесь: http://groups.google.com/group/delayed_job/browse_thread/thread/f7d0534bb6c7c83f/37b4e8ed7bfaba42

Проблема заключается в следующем:

DJ использует буферизованный журнал Rails в процессе производства, и очистка буфера не запускаетсяпо какой-то причине (не знаю, сбрасывается ли он по размеру буфера или явно сбрасывается после запроса).

Временное исправление (благодарность Натану Фелпсу):

При работе в буферизованном журнале устанавливается значение auto_flushing 1000, что означает, что сброс не вызывается до тех пор, пока не будет зарегистрировано 1000 сообщений.Предполагая, что вы используете в сочетании с delayed_job colleideidea, вы можете решить эту проблему, установив auto_flushing более разумное значение в command.rb сразу после инициализации регистратора в строке 64. IE

Delayed :: Worker.logger =Rails.logger

Задержка :: Worker.logger.auto_flushing = 1 # или что-то еще

У меня отлично работает!

0 голосов
/ 04 февраля 2010

У меня была похожая проблема.Регистрация в форке colleideidea переписывается - см. эту проблему для получения дополнительной информации.Возможно, попробуйте самую новую версию, чтобы увидеть, исправляет ли она это для вас.

0 голосов
/ 04 февраля 2010

Похоже, вы пытаетесь войти в закрытый файл.Возможно, вы рассматривали возможность использования самоцвета SyslogLogger?

Вот статья о том, как использовать его с рельсами , которая должна помочь вам начать работу.

...