ロガーをレールレーキタスクに置く


108

rakeタスクでputsコマンドを使用すると、コンソールに出力が表示されます。ただし、アプリが本番環境にデプロイされている場合、ログファイルにそのメッセージは表示されません。

ただし、Rails.logger.infoと言うと、開発モードではコンソールに何も表示されません。ログファイルに移動して、それを追跡する必要があります。

Rails.logger.infoを使用するのが理想的です。rakeタスク内の開発モードでは、ロガーからの出力もコンソールに送信する必要があります。

それを達成する方法はありますか?

回答:


57

これをapplication.rb、またはrakeタスク初期化コードに入れます

if defined?(Rails) && (Rails.env == 'development')
  Rails.logger = Logger.new(STDOUT)
end

これはRails 3のコードです。これはへのロギングを上書きすることに注意してくださいdevelopment.log。あなたは、両方が必要な場合STDOUTdevelopment.log、あなたはラッパー関数が必要になります。

この動作をRailsコンソールでのみ行う場合は、同じコードブロックをに配置します~/.irbrc


26
単にRails.logger = Logger.new(STDOUT)development.rbに入れる方が簡単ではないでしょうか?
ghempton 2012

レール2の場合、これを開発にconfig.logger = Logger.new(STDOUT)
追加

38

これを機能させるには、新しいrakeタスクを作成します。

desc "switch logger to stdout"
task :to_stdout => [:environment] do
 Rails.logger = Logger.new(STDOUT)
end

このようにして、rakeタスクを実行するときに、最初にto_stdoutを追加してstdoutログメッセージを取得するか、デフォルトのログファイルにメッセージを送信するためにそれを含めないでください

rake to_stdout some_task

11

Rakeタスクは、ユーザーがコマンドラインで実行します。彼らがすぐに知る必要があるもの(「5行が処理された」)は、を使用して端末に出力する必要がありますputs

後世のために保管する必要があるもの(「jsmith@example.comに送信された警告メール」)は、に送信する必要がありRails.loggerます。


17
cronでrakeタスクを実行することは珍しくありません。
Johannes Gorset 2013年

2
そうだね。cronジョブの完了時にログメッセージがメールで送信されるようにするには、それらを$ stdoutまたは$ stderrに出力します。
ジョナサンジュリアン

10

使うのRails.logger.infoが道だと思います。

サーバー経由で実行されないため、サーバーコンソールで表示することはできません。新しいコンソールとtail -fログファイルを開くだけでうまくいきます。

多くのユーザーは、大きなファイルの最後の数行を表示するために使用できるUNIX®コマンド 'tail'を知っています。これは、ログファイルの表示などに役立ちます。

状況によっては、「tail」コマンドの「-f」パラメータがさらに役立ちます。これにより、tailはファイルの出力を「追跡」します。最初は、応答はそれ自体の「tail」の場合と同じです。ファイルの最後の数行が表示されます。ただし、コマンドはプロンプトに戻りませんが、代わりにファイルを「フォロー」し続けます。ファイルに行が追加されると、それらは端末に表示されます。これは、ログファイルや、時間の経過とともに追加される可能性があるその他のファイルを監視するのに非常に役立ちます。このオプションと他のテールオプションの詳細については、「man tail」と入力してください。

経由


しかし、タスクを呼び出したのと同じウィンドウに出力が表示されないため、ローカルマシンでの作業中はあまり快適ではありません。特に、複数のウィンドウを並べて表示するのに適した大画面がない場合。
Tomas Markauskas、2010

10
tailf「tail -fに似ていますが、成長していないファイルにはアクセスしません」(マンページから)を使用するのがさらに良いです。それも短い
MBO

@tomasなぜサーバーログコンソールを最小化せず、tail-fが実行されているコンソールを1つだけ持つのですか?あなたはシステム大した私見の特定の部分で作業しているとき、とにかくそれは...私は私のアプリで何が起こっているかを追跡する8つのコンソールのような本当の問題は実行していないです、ちょうどタブを切り替える
marcgg

@mbo nice :) halasそれは私のマシン(mac os @ leopard)で利用できるように見えません
marcgg

1
@marcgg:「サーバーコンソール」はありません(私はパッセンジャーを使用しています)が、rakeタスクに関する質問です。1つのターミナルウィンドウからタスクを実行した場合、そのウィンドウにはロガーから何も表示されません。出力を表示するには、development.logを含む別のウィンドウが必要です。理想的には、何らかの方法でstdoutを別の出力ストリームとしてRails.loggerに追加しますが、元の出力ストリームは削除しません。
Tomas Markauskas

9

コード

Rails 4以降では、ロガーブロードキャストを使用できます。

開発モードでrakeタスクのSTDOUTとファイルロギングの両方を取得する場合は、このコードをに追加できますconfig/environments/development.rb

  if File.basename($0) == 'rake'
    # http://stackoverflow.com/questions/2246141/puts-vs-logger-in-rails-rake-tasks
    log_file     = Rails.root.join("log", "#{Rails.env}.log")
    Rails.logger = ActiveSupport::Logger.new(log_file)
    Rails.logger.extend(ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT)))
  end

テスト

上記のコードをテストするための小さなRakeタスクを次に示します。

# lib/tasks/stdout_and_log.rake
namespace :stdout_and_log do
  desc "Test if Rails.logger outputs to STDOUT and log file"
  task :test => :environment do
    puts "HELLO FROM PUTS"
    Rails.logger.info "HELLO FROM LOGGER"
  end
end

実行中のrake stdout_and_log:test出力

HELLO FROM PUTS
HELLO FROM LOGGER

ながら

HELLO FROM LOGGER

に追加されましたlog/development.log

実行中のrake stdout_and_log:test RAILS_ENV=production出力

HELLO FROM PUTS

ながら

HELLO FROM LOGGER

に追加されましたlog/production.log


Rails 5ではbasename($0) == 'rake'railsコマンド自体が実行されるため、このトリックは機能しませんrake。を設定するタスクに依存する以上に、その代わりになるものを見つけたいですbroadcast。(その部分は、少なくとも、まだ問題なく動作します。)
ブレントロイヤルゴルドン

@ BrentRoyal-Gordon開発ではこの条件文は必要ありませんRakefile。プロジェクトのルートにコードを追加するだけです
Mauricio Pasquier Juan

4

実行中の環境を検出して正しいことを行うアプリケーションヘルパーを作成してみませんか?

def output_debug(info)
   if RAILS_ENV == "development"
      puts info
   else
      logger.info info
   end
end

次に、putsまたはlogger.infoの代わりにoutput_debugを呼び出します。


5
これは良い考えではないと思います。Railsロガーは構成可能であることを意味しますが、その構成可能性を使用する代わりに、ここにさらにロガーを重ねます。
Sijmen Mulder

同じチェックが行われますので、はい、それは良い考えではありません毎回何かをログに記録しますが。
furiabhavesh 2016

3

Rails 2.Xでは、ロガーをモデルのSTDOUTにリダイレクトします。

ActiveRecord::Base.logger = Logger.new(STDOUT)

コントローラのロガーをリダイレクトするには:

ActionController::Base.logger = Logger.new(STDOUT)

私もこの記事を見つけました。非常に便利なsepcot.com/blog/2009/08/rails-logging-to-stdout
Tania R

2

'&'でバックグラウンドジョブを実行し、スクリプト/コンソールなどを開きます。これにより、同じウィンドウで複数のコマンドを実行できます。

tail -f log/development.log &
script/console
Loading development environment (Rails 2.3.5)
>> Product.all
2011-03-10 11:56:00 18062 DEBUG  Product Load (6.0ms)  SELECT * FROM "products"
[<Product.1>,<Product.2>]

noteログの出力が多い場合、すぐにだらしになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.