1. ホーム
  2. ruby-on-rails

[解決済み] Rails 例外のスタックトレース全体をログに記録する

2022-07-06 04:26:36

質問

私はスタックトレースを記録する正しい方法を見つけようとしています。私は遭遇した この のリンクを見つけました。 logger.error $!, $!.backtrace は行くための方法ですが、それは私のために動作しません log_error を実行します。ドキュメントによると、railsが使用するruby loggerは単一の引数しか受け入れないので、errorメソッドに第2の引数を渡すことがどのように機能するかはわかりません。

不思議なことに(あるいはそうでないかもしれませんが)、第2引数はインタープリタに文句を言われることなく受け入れられます。しかし、私がそれに渡すものはすべて無視されます。

誰か私が見逃しているものを説明することができますか?エラーへの2番目の引数が何のためにあり、何がそれを食べているのかについてのどんな洞察でも?

どのように解決するのですか?

ActiveSupportのBufferedLoggerクラスのソースを見ると、第2引数に「progname」があることがわかります。これは、第1引数がnilで、ブロックを与えていないか、ブロックが真値でない値を返している場合のみ使用されます。

要するに、第2引数を使って追加で出力することはできないのです。

やりたいことは、もっと似たようなことです。

begin
  raise
rescue => e
  logger.error e.message
  logger.error e.backtrace.join("\n")
end

ロギングの設定によっては、バックトレースの各行を繰り返し、改行を出力しないロガーがあるため、別々に出力したほうがよいかもしれません。

begin
  raise
rescue => e
  logger.error e.message
  e.backtrace.each { |line| logger.error line }
end