2009-04-19 14 views
6

Rubyプログラムでスローされた例外をキャッチしてファイルに記録するライブラリがありますか?私はlog4rloggerを見てきましたが、両方のドキュメントには私がこれを行う方法の例はありません。私はこのプログラムをリモートで実行し、その情報がまったく役に立ったらstdoutとstderrへのハンドルを失います。Rubyで自動的に例外をログに記録する

お勧めですか?

答えて

14

、これを試してみてください。

class Exception 
    alias real_init initialize 
    def initialize(*args) 
    real_init *args 
    # log the error (self) or its args here 
    end 
end 

これは創造の瞬間に新しい例外オブジェクトの作成をインターセプトします。

+1

ありがとうMarkus!ワイルドサイドがうまくいくなら、私はそれを歩きたいと思っています! –

+0

upvoted for creativity! –

+4

これは楽しいですが、私は例外をモンキーにすることに非常に注意しています... –

4

レスキューfrom Exception。このような何かはおそらく理にかなって:

begin 
    # run your code here .. 
rescue Exception => exception 
    # logger.error(...) .... 
    raise exception 
end 

これは例外をログに記録し、アプリケーションが実際にログに加えて、エラーが発生するように、それを再発生させます。

exceptionExceptionのインスタンスです。このオブジェクトでできること(バックトレースへのアクセスなど)については、the docsを参照してください。あなたは野生の側の散歩をしたい場合は

+1

ええと、それは私がやらなければならないことを恐れていたことです。関与するコードは基本的に1つのクラスであり、いくつかのメソッドがあります。私はちょうどすべての方法に始まり/救助を入れなければならないのでしょうか、それとも簡単な方法がありますか? –

+0

おそらくインスタンスを作成しています。インスタンスを作成する場所にレスキューブロックを置いてください。 –

+0

インスタンス作成コードに置くことは、エラーが作成中でない限りうまくいくことはありません。エラーが発生した場合は、全世界に渡って本体をラップしてください。 – MarkusQ

2

Railsアプリを実行している場合、Exception Notificationプラグインは非常に便利です。

+0

ああ、私は間違いなくそれを見ましたが、問題の私のアプリはRailsアプリではありません。しかし、ありがとう! –

0

私はこのようなものでした場合、それが働くだろう:私はすべての私のキャッチされない例外を持つようにされる必要がある何

begin 
    main() 
rescue Exception => e 
    myCustomErrorLogger(e) 
end 

def main() 
    # All the application code comes here. 
end 

は、最上位レベルに移動し、そこにキャッチされ、その後エラーログで記録されるが関数。

私は今これを試していますが、あなたの提案を得ることは素晴らしいことです。

0

理由とバックトレースを標準出力する部分のExceptionクラスのコードを調整できます。

ロガーがnullになる可能性があるかどうかを確認することを忘れないでください。ロガーが作成された前(またはその間)に例外をスローすることができます。

関連する問題