web-dev-qa-db-ja.com

puts vs logger in Rails rake tasks

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

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

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

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

106
Nick Vanderbilt

これを_application.rb_に入れるか、rakeタスクの初期化コードに入れます

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

これはRails 3コード。これは_development.log_へのロギングをオーバーライドすることに注意してください。STDOUTと_development.log_の両方が必要な場合はラッパー関数が必要です。 。

Railsコンソールでのみこの動作が必要な場合は、同じコードブロックを_~/.irbrc_に配置します。

55
shmichael

新しい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
30
Pete Brumm

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

後世のために保持する必要があるもの(「[email protected]に警告メールを送信」)はRails.logger

11
Jonathan Julian

Rails.logger.infoは進むべき道です。

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

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

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

via

10
marcgg

コード

Rails 4以降では、 Logger broadcast を使用できます。

開発モードで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に追加されました。

9
Eric Duminil

どの環境が実行されているかを検出し、正しいことを行うアプリケーションヘルパーを作成するのはどうですか?

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

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

4
naven87

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

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

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

ActionController::Base.logger = Logger.new(STDOUT)
3
Tania R

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

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>]

大量のログ出力がある場合、すぐにずさんになります。

2