10

アプリケーションを再起動せずに、実行中のRails3.2.xアプリケーションのログレベルを変更したいと思います。私の意図は、通常のログレベルに戻す前に、これを使用して短時間のデバッグと情報収集を行うことです。

また、昇順のレベルはデバッグ、情報、警告、エラー、および致命的であり、本番サーバーは情報以上をログに記録し、開発ログはデバッグ以上をログに記録することも理解しています。

走れば

Rails.logger.level=:debug #or :info, :warn, :error, :fatal

これにより、ログレベルがすぐに変更されますか?

もしそうなら、ログレベルを調整するためにRakeタスクを書くことによってこれを行うことができますか、それともルートを追加することによってこれをサポートする必要がありますか?たとえば、config/routes.rbでは次のようになります。

match "/set_logging_level/:level/:secret" => "logcontroller#setlevel" 

次に、ログコントローラでレベルを設定します。(:levelはログレベルであり、クライアントとサーバー間で共有される:secretは、ランダムなユーザーがログレベルを微調整するのを防ぐためのものです)

raketaskと/set_logging_levelのどちらがより適切ですか?

4

6 に答える 6

14

そのためにオペレーティングシステムの信号を使用してみませんか?たとえば、UNIXの場合、user1およびuser2シグナルは、アプリケーションで自由に使用できます。

config/initializers/signals.rb:

trap('USR1') do
  Rails.logger.level = Logger::DEBUG
end

trap('USR2') do
  Rails.logger.level = Logger::WARN
end

次に、これを実行します。

kill -SIGUSR1 pid
kill -SIGUSR2 pid

サーバーのシグナルをオーバーライドしないように注意してください。各サーバーは、ログローテーション、子プロセスの強制終了や終了などのさまざまなシグナルを利用します。

于 2013-07-18T10:40:16.283 に答える
7

Railsコンソールでは、次のことを簡単に行うことができます。

Rails.logger.level = :debug

これで、実行されたすべてのコードがこのログレベルで実行されます

于 2020-02-27T00:35:55.827 に答える
4

コントローラのLogControllerでこれを試してください

def setlevel
  begin
      Rails.logger.level = Logger.const_get(params[:level].upcase)
  rescue
      logger.info("Logging level #{params[:level]} not supported")
  end
end
于 2013-01-29T19:58:42.687 に答える
4

実行中のrailsインスタンスのレベルを変更する必要があるため、単純なrakeタスクは機能しません。
専用ルートで行きます。

共有シークレットの代わりに、アプリの標準ユーザー認証(アプリにユーザーがいる場合)を使用し、管理者/スーパーユーザーへのアクセスを制限します。

于 2013-01-29T20:02:23.810 に答える
3

gdbを使用して実行中のプロセスに接続し、Rails.loggerをデバッグレベルに設定してからデタッチすることもできます。私は私のピューマプロセスのためにこれを行うために次の1つのライナーを作成しました:

gdb attach $(pidof puma) -ex 'call(rb_eval_string("Rails.logger.level = Logger::DEBUG"))' -ex detach -ex quit

注:pidofは、降順で複数のpidを返します。したがって、同じ名前のプロセスが複数ある場合、これはpidofによって返された最初のプロセスでのみ実行されます。その他は、「gdbattach」コマンドによって「過剰なコマンドライン引数は無視されます。(26762)」というメッセージとともに破棄されます。ただし、pidofによって返される最初のプロセスのみを気にする場合は、無視しても問題ありません。

于 2015-03-08T22:27:29.340 に答える
1

rufus-schedulerを使用して、次のスケジュールを作成しました。

scheduler.every 1.second do
  file_path = "#{Rails.root}/tmp/change_log_level.#{Process.pid}"
  if File.exists? file_path
    log_level = File.open(file_path).read.strip
    case log_level
    when "INFO"
      Rails.logger.level = Logger::INFO
      Rails.logger.info "Changed log_level to INFO"
    when "DEBUG"
      Rails.logger.level = Logger::DEBUG
      Rails.logger.info "Changed log_level to DEBUG"
    end
    File.delete file_path
  end
end

次に、の下にファイルを作成することでログレベルを変更できますtmp/change_log_level.PID。ここpidで、はrailsプロセスのプロセスIDです。rake / capistranoタスクを作成してこれらのファイルを検出および作成し、実行中の本番サーバーのログレベルをすばやく切り替えることができます。

ユニコーンなどを使用している場合は、ワーカースレッドでrufusを開始することを忘れないでください。

于 2013-10-15T11:34:53.683 に答える