如何将所有rake任务写入同一日志文件?

时间:2011-12-12 02:10:14

标签: ruby-on-rails-3 logging rake

我有两个rake任务,我想每晚运行。我希望他们登录到一个文件。我认为这可以解决问题(得到它:Rake: logging any task executing):

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 site未提及登录rake任务。我正在调用的任务相当复杂(大约需要20-40分钟),所以我真的想知道如果它们失败了会出错。我更喜欢DRY理由只创建一次logger对象。

2 个答案:

答案 0 :(得分:1)

除非你将所有内容都包含在巨大的开始/救援中并以这种方式捕获错误,否则记录错误的最佳方法是从stderr和stdout中捕获所有输出:

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

您也可以将Rails环境设置为使用系统记录器。

答案 1 :(得分:1)

我最终通过制作“日志”任务并在其他任务中依赖于此来解决此问题(或至少足够好)。不是很理想,因为这意味着必须在任何新任务中包含该依赖项,但我只有一些任务,所以这样做会很好。我知道有一个“文件”任务但它似乎不想在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