【问题标题】:how do I get all my rake tasks to write to the same log file?如何让我的所有 rake 任务写入同一个日志文件?
【发布时间】:2011-12-12 02:10:13
【问题描述】:

我有两个想要在夜间运行的 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

我已经尝试了几种调用日志的方式(@,@@,没有@),但都无济于事。在此处阅读有关它的几个主题。这 rubyonrails.org site 没有提到登录 rake 任务。我正在调用的任务相当复杂(大约需要 20-40 分钟才能完成),所以我真的很想知道如果它们失败了出了什么问题。出于 DRY 的原因,我宁愿只创建一次 logger 对象。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        • 1970-01-01
        相关资源
        最近更新 更多