Rakeタスクでputsコマンドを使用すると、コンソールに出力が表示されます。ただし、アプリが実稼働環境にデプロイされている場合、ログファイルにそのメッセージは表示されません。
ただし、Rails.logger.infoと言うと、開発モードではコンソールに何も表示されません。私はログファイルに行き、それを尾行する必要があります。
Rails.logger.infoを使用し、rakeタスク内で開発モードで使用するのが理想的です。ロガーからの出力もコンソールに送信する必要があります。
それを達成する方法はありますか?
これを_application.rb
_に入れるか、rakeタスクの初期化コードに入れます
_if defined?(Rails) && (Rails.env == 'development')
Rails.logger = Logger.new(STDOUT)
end
_
これはRails 3コード。これは_development.log
_へのロギングをオーバーライドすることに注意してください。STDOUT
と_development.log
_の両方が必要な場合はラッパー関数が必要です。 。
Railsコンソールでのみこの動作が必要な場合は、同じコードブロックを_~/.irbrc
_に配置します。
新しい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
Rakeタスクは、ユーザーがコマンドラインで実行します。すぐに知る必要があるもの(「処理された5行」)は、puts
を使用して端末に出力する必要があります。
後世のために保持する必要があるもの(「[email protected]に警告メールを送信」)はRails.logger
。
Rails.logger.info
は進むべき道です。
サーバー経由では実行されないため、サーバーコンソールで表示することはできません。新しいコンソールを開いてtail -f
ログファイル、トリックを行います。
多くのユーザーは、大きなファイルの最後の数行を表示するために使用できるUNIX®コマンド「tail」を知っています。これは、ログファイルなどを表示するのに役立ちます。
状況によってはさらに便利なのが、「tail」コマンドの「-f」パラメーターです。これにより、tailはファイルの出力を「追跡」します。最初は、応答は単独で「tail」の場合と同じになります-ファイルの最後の数行が表示されます。ただし、コマンドはプロンプトに戻らず、代わりにファイルを「フォロー」し続けます。ファイルに追加の行が追加されると、端末に表示されます。これは、ログファイルや、時間の経過とともに追加される可能性のある他のファイルを監視するのに非常に便利です。このオプションおよびその他のテールオプションの詳細については、「man tail」と入力してください。
( via )
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
に追加されました。
どの環境が実行されているかを検出し、正しいことを行うアプリケーションヘルパーを作成するのはどうですか?
def output_debug(info)
if Rails_ENV == "development"
puts info
else
logger.info info
end
end
次に、putsまたはlogger.infoの代わりにoutput_debugを呼び出します
In Rails 2.XでロガーをモデルのSTDOUTにリダイレクトします。
ActiveRecord::Base.logger = Logger.new(STDOUT)
コントローラでロガーをリダイレクトするには:
ActionController::Base.logger = Logger.new(STDOUT)
'&'でバックグラウンドジョブを実行し、スクリプト/コンソールなどを開きます。この方法で、同じウィンドウで複数のコマンドを実行できます。
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>]
注大量のログ出力がある場合、すぐにずさんになります。