我有两个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
对象。
答案 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