Как я могу получить все мои грабли задачи для записи в тот же файл журнала? - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть две рейк-задачи, которые я хотел бы выполнять по ночам. Я хотел бы, чтобы они записали в один файл. Я думал, что это сработает (получил здесь: Rake: регистрация любой задачи, выполняющей ):

application.rb

module Rake
  class Task
    alias_method :origin_invoke, :invoke if method_defined?(:invoke)
    def invoke(*args)
      @logger = Logger.new('rake_tasks_log.log')
      @logger.info "#{Time.now} -- #{name} -- #{args.inspect}"
      origin_invoke(args)
    end
  end
end

, а затем в rakefile:

task :hello do
  @logger.warn "Starting Hello task"
  puts "Hello World!"
  puts "checking connection "
  checkConnection
  puts "done checking"
  @logger.debug "End hello rake task"
end

Но когда я запускаю задачу, я получаю:

private method 'warn' called for nil:NilClass

Я попробовал несколько вариантов этого призыва к ведению журнала (@, @@, no @) безрезультатно. Прочитайте несколько веток здесь об этом. На сайте rubyonrails.org не упоминается вход в rake-задачи. Задачи, которые я вызываю, довольно сложные (около 20-40 минут), поэтому я действительно хочу знать, что пошло не так, если они потерпят неудачу. Из-за СУХОГО я бы предпочел создать объект logger только один раз.

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

В итоге я решил (или, по крайней мере, достаточно хорошо) решил задачу «войти» и зависел от других задач.Не совсем идеально, так как это означает необходимость включения этой зависимости в любую новую задачу, но у меня есть только несколько задач, так что это будет хорошо.Я знаю, что есть «файловая» задача, но она, похоже, не работает в Windows, поэтому я выбрал ее, потому что она более кроссплатформенная и более явная.объект logger, потому что я передаю этот объект в некоторые вызовы методов в разделах [...].Там достаточно начала / спасения / конца, чтобы запись в выходной поток не работала (я думаю).

@log_file =  "log/tasks.log"
directory "log"

task :check_log => ["log"] do
  log = @log_file
  puts 'checking log existence'
  if not FileTest.exists? ("./#{log}")
    puts 'creating log file'
    File.open(log, 'w')
  end
end

task :check_connection  => [:check_log] do
  begin
    conn = Mongo::Connection.new
    [...]
  end
end


task :nightly_tasks => [:check_connection, :environment ] do
  for i in 1..2
     logger.warn "#########################"
  end
  [...]
  logger.warn "nightly tasks complete"
end

def logger
  @@logger ||= Logger.new( File.join(Rails.root, @log_file) )
end
1 голос
/ 12 декабря 2011

Если вы не оборачиваете все в гигантские команды begin / rescue и не отлавливаете ошибки таким образом, лучший способ регистрировать ошибки - перехватывать весь вывод из stderr и stdout с помощью чего-то вроде:

rake your:job 2>&1 >> /var/log/rake.log

также настройте свою среду Rails на использование системного логгера.

...