2011-12-12 53 views
0

我有两个耙子任务,我想每晚跑步。我希望他们登录到一个文件。我认为这会做的伎俩(得到它在这里: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对象。

回答

1

除非你包裹在巨大的一切开始/救援的接球失误这种方式,记录错误的最好办法是捕捉从标准错误的所有输出,并与类似标准输出:

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

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

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 
相关问题