2010-05-04 48 views
4

我有幾個經由Rake運行的頻繁的Cron作業,並且這些作業的輸出通過電子郵件發送(通過MAILTO)。由於這些任務加載Rails環境(包括Erubis),因此它們在啓動時總是打印出「** Erubis 2.6.5」。這意味着自Cron收到輸出以來始終會生成電子郵件。有什麼辦法可以配置Erubis停止將這個啓動消息打印到控制檯上嗎?當啓動Rails環境時,有什麼辦法可以禁用Erubis打印「** Erubis 2.6.5」嗎?

回答

1

您需要erubis重新定義rails_helper.rb - 這些都是冒犯行:

## finish 
ActionController::Base.new.logger.info "** Erubis #{::Erubis::VERSION}" 
$stdout.puts "** Erubis #{::Erubis::VERSION}" if rails22 

我建議文件到新的複製內容,刪除記錄的線條和requre是better_rails_helper erubis providef一個代替。 。 `

2

更新:下面的解決方案來自幾年前,適用於鐵路2是新的和插件仍然普遍。現在,使用寶石是更好的和標準的解決方案,下面的答案不再適用於較新的應用程序;相反,@TALlama發佈的解決方案是可行的。儘管我在這裏留下了這個答案,因爲它是一個可行的解決方案,以防你的應用程序老舊並仍然使用插件。

您可以修改rails_xss插件以刪除此消息。該插件的攻擊部分位於「/plugins/rails_xss/lib/rails_xss/erubis.rb」。在文件的最頂端是一個要求:

require 'erubis/helpers/rails_helper' 

修改此要求的要求之前標準輸出簡單地重定向到一個虛擬IO,並恢復到標準輸出,當你做了,是這樣的:

stdout_original, $stdout = $stdout, StringIO.new 
require 'erubis/helpers/rails_helper' 
$stdout = stdout_original 

這很醜陋,但它以相對非侵入性的方式解決了問題。我和OP有類似的問題,需要將「腳本/運行」過程的輸出傳遞給另一個進程,而erubis粗暴地破壞了關於在stdout前端保持沉默的rails組件/插件的約定(正是因爲這個原因) 。上面的解決方案就是我想出來的,對我來說很有用。

+0

如果你仍然想看到「Erubis」消息但不希望它傳遞給其他進程,則可以將標準輸出重定向到標準錯誤的副本而不是虛擬字符串。爲此,在上面的代碼片段中用「$ stderr替換」StringIO.new「。dup「 – 2010-08-20 17:19:29

2

使用這裏的答案加上@ michael-andrews鏈接的答案,我對我們的Rails 2.3.14項目進行了以下更改,該項目不需要更改我們的寶石源代碼。打開config/boot.rb並找到Rails::Boot類。你增強了load_gems方法:

class Rails::Boot 
    def run 
    load_initializer 

    Rails::Initializer.class_eval do 
     def load_gems 
     buffer = "" 
     previous_stdout, $stdout = $stdout, StringIO.new(buffer) 

     @bundler_loaded ||= Bundler.require :default, Rails.env 
     ensure 
     $stdout = previous_stdout 

     output = buffer.gsub(/^\*\* Erubis (\d+\.?)+\s*/, '') 
     puts output unless output.strip.empty? 
     end 
    end 

    Rails::Initializer.run(:set_load_path) 
    end 
end 

這種工作方式是,我們重定向$同時加載寶石標準輸出,流揪成一個本地緩衝區。然後,我們在完成所有事情後檢查緩衝區,刪除Erubis的標註,並顯示可能發生的任何其他事情(不想錯過任何我們沒有預料到的事情!)。

相關問題