2011-08-12 10 views
3

私は、ファイルにリダイレクトして他のツールで開くことができるCSV出力を生成するRakeタスクをいくつか持っていますが、heroku rake foo > foo.csvを実行すると、出力にログメッセージ(SQLクエリなど)が表示されます。HerokuでRakeタスクを実行すると、ログメッセージがSTDOUTから出ないようにするにはどうすればよいですか?

Rakeタスクの先頭にRails.logger = Logger.new('/dev/null')Rails.logger = Logger.new(STDERR)を試しましたが、それらはローカルで期待どおりに機能していましたが、Herokuでタスクを実行すると大きな効果はありません。

私はHerokuがSTDOUTとSTDERRを一緒に盛り上げることにショックを受けませんでしたが、なぜ/ dev/nullに送信すると出力が消えないのかは私にとって謎です。

大変助かりました。

Rails v3.0.0、ヘロク竹ree-1.8.7スタック、rake 0.9.2。 Heroku | Dev Center | Loggingから

答えて

1

:Railsのアプリが押されると、我々は自動的にstdoutにログをリダイレクトするアプリケーションにrails_log_stdoutプラグインをインストールします

が、私はこのことについての通知(ごgit pushコマンドを介して送信される出力に)Herokuのは、含まれて考える(他1追加:私の記憶が正しければ、静的/ publicコンテンツを提供するため)。しかし、特定の種類のプッシュの通知のみが表示されることがあります(スラッグが完全に再構築されますか?)。私は最近、新しいアプリケーションをBamboo/MRI-1.9.2スタックにプッシュしたときにそれを見たのを覚えていますが、アプリケーションのコードだけに変更を加えるたびにメッセージを受け取ったとは思いません(おそらくGemfileそれを起動するには十分ですか?)。


いくつかのRailsのサブシステムは、独自のlogger結合おく(その値はしばしばRails.loggerから初期化されている独立したバインディングを、再割り当て元を変更しない後者):

ActiveRecordが初期化される前にHerokuの変更がRails.loggerの新しい値に設定されている可能性があります。 ActiveRecordが最終的にロードされると、自身のloggerRails.logger(Heroku/stdoutのもの)と同じに設定します。タスクが実行されると、Rails.loggerが再割り当てされますが、ActiveRecord::Base.loggerに影響するには遅すぎます(SQLログを処理する可能性が最も高い)。

他のloggerバインディングの一部を再割り当てして、STDOUTに行くログをスケルチする必要があります。他の可能性のある場所は、Rails 2セクションのrails_log_stdoutのinit.rbにリストされています。

+1

私はこのことを認識していますので、私は一般的に知っていたが無視することができたと

if 'rake' == File.basename($0) ActiveRecord::Base.logger = Logger.new('rake.log', 'daily') end 

: – camdez

2

私はこれを持っているconfig/environments/production.rbを変更するまで、私はそれに実行されませんでしたが、同じ問題を抱えていた:私のアプリは、Herokuのログにログインなるように

config.logger = Logger.new(STDOUT) 

は(私はこれをしませんでした。)

私の修正は、このだった:私は同じ問題に直面し、次は、より便利な回避策であることが判明し

config.logger = Logger.new(STDOUT) unless 'rake' == File.basename($0) 
1

config/environments/production.rb

config.logger.level = Logger.const_get(ENV['LOG_LEVEL'] ? ENV['LOG_LEVEL'].upcase : 'INFO') 

プッシュに以下を追加します。あなたのレーキタスクを実行すると、LOG_LEVEL="fatal"を最後に追加します。(0123を置き換えますとあなたの事でfoo.csv):

heroku run rake foo LOG_LEVEL="fatal" > foo.csv 

私は、上記の例ではfatalからlog_levelセットを持っているが、それは次のいずれかになりますdebug|info|warn|error|fatal。私たちの場合、最も高い値を使うことは何も意味しませんが、最も致命的なエラーはcsvファイルに出力されます。ただ、Herokuのに押して「新鮮」のRailsプロジェクトに人を助けるために

0

あなたは@MattバークのとHengjieの答え@の組み合わせが必要になります。

/設定/環境にこれらの2行を追加します。 production.rb

config.logger = Logger.new(STDOUT) 
config.logger.level = Logger.const_get(ENV['LOG_LEVEL'] ? ENV['LOG_LEVEL'].upcase : 'INFO') 

この意志のセットアップ新しいSTDOUTロガーとは、簡単にLOG_LEVEL環境変数を使用してログの解像度を制御することができます。私たちは、出力だけでなく

if 'rake' == File.basename($0) 
    ActiveRecord::Base.logger = Logger.new('/dev/null') 
end 
0

は私がproduction.rbを次のように変更してこの問題を解決し何が起こっているのか、原因は何ですか?解決策は何ですか?