ロガーの障害をどのように処理すればよいですか?


12

当社のアプリケーションのいくつかでは、カスタムロガーを使用しています。かなり堅牢ですが、将来NLogのようなものに置き換える可能性があります。ロガーのタスクの1つは、アプリケーションで発生した例外をログに記録することです。

私が常に抱えていた懸念の1つは、ロガー内の例外処理がサイレント障害を許容することです。つまり、ログが特定の例外(ロガーのエラーのため)に書き込まれていない場合、どのようにログを処理し、(どういうわけか)ロガー自体に例外を記録する必要がありますか?

WriteLog関数が例外をスローするとします。関数を何回か、または例外がスローされなくなるまで呼び出そうとしますか?スローされた例外をロガーで書き込もうとする必要があります(これにより、例外が発生する可能性が高くなります。最初にカスタムロガーを実装していたときを除いて、この状況に出会えないほど幸運でした。一方で、ロガーがアプリケーションの例外(独自の例外のため)のログに失敗したかどうかを現時点で知る方法はありません。

私はオンラインといくつかのSEサイトで検索しようとしましたが、すべての投稿がロガーのエラー(潜在的な例外とそれらのログ方法ではありません)またはロガー外の例外を扱っているため、これまでのところ無駄です。



5
stderr出力メディアに障害が発生したか、「不可能」が発生したことをログに記録します。
ドーバル14

1
開発者に電子メールを送信するか、エラーを電子メールアドレスとともに表示して、ユーザーにエラーをコピーして貼り付けさせます。
クロエ14

回答:


17

ロガー内で例外が発生した場合、ロガーを使用して例外をログに記録しないでください。その理由は次のとおりです。

  • 無限ループに陥っている可能性があります。ロガー内に、テストされていない(そして例外を生成する)条件分岐があると想像してください。条件が満たされると、それ以降に報告された例外はすべて同じブランチで処理されることを想像してください。これは、ブランチが実行された瞬間から、無限ループに陥ることを意味します。

  • 一時的なループに陥り、1秒あたり数千の例外が発生する場合があります。リモートサーバーに例外を報告しているとします。サーバーの問題により別の例外が発生し、接続が復帰するまで別の例外が発生します。

代わりに行うべきことは、例外をログに記録するより安全な方法にフォールバックすることです。たとえば、ロガーがリモートサーバーに例外を送信する場合、syslog代わりにロガー内の例外を送信します。ロガーがWindowsイベントで例外を記録し、このアクションが失敗した場合、単純なテキストファイルに失敗の例外を保存します。

それができたら、次の質問は、それらの例外が発生したことをどのように知るかです:数千のサーバーで数十のアプリケーションを実行している場合、ローカルで何かをログに記録しているかどうかを定期的に確認することはできません。

1つの方法は、それらの「例外ログ」をチェックし、他の例外が保存されている場所にプッシュするcronジョブを持つことです(最終的にロガーを使用しますが、無限ループまたは一時ループに注意してください)。


私は、電子メールに送信された例外ロガーでこの同じ問題に遭遇しました。サーバーへの接続に失敗した場合、ひどい無限ループに入りました。そこで、代わりに、イベントログに迂回し、新しい接続が確立されるまで新しい電子メールが送信されないように、チェックを配置しました。
mgw854 14

私たちはあなたが提案するようにフォールバックを実装しようとすると思います。Jon Raynorによるアプリケーションの停止(クリティカルロギング状況)の提案も、検討していなかったものの1つです。
ザイルジャ14

syslogへの送信タイムアウトまたはファイルへのI / Oエラーが発生した場合はどうなりますか?障害の原因がネットワークの混雑またはディスク領域の不足にある場合、問題をさらに悪化させる可能性があります。これは正確な全体的な解決策ではありません。エラーをログに記録する安全な方法がない可能性を考慮する必要があります。それは危険が長いなど、あなた組み込んサイクル検出、指数バックオフ、などとして、独自のロガーにログを記録することはありません
Aaronaught

11

ロギングがアプリケーションにとって重要な場合、ロギングが失敗したらアプリケーションを停止する必要があります。

クリティカルでない場合は、ある程度防御的であるため、セカンダリソースへのログ/アラートを行うロギングエラーを処理するセカンダリコンポーネントを使用できます。しかし、それでも完全な証拠ではなく、プライマリロガーを監視しているときにセカンダリロガーが失敗した場合に何が起こるかを考慮する必要があります。

優れた戦略は、ローカルファイルにログを記録し、それが失敗した場合、イベントログにそのログを記録し、電子メールアラートを生成し、データベースに保存するなどです。ディスク容量不足またはその他のまれな状態。

理想的には、アプリケーションの複雑さを軽減するため、静かに失敗するほうが良いでしょう。

さらに重要なことは、ロギング障害を処理するには、サードパーティからのログを監視することです。時間が経つにつれて、健全なアプリケーションがログに記録しているイベントの数を識別できるようになります。低レベルのログ記録を開始するか、イベントを記録しない場合、監視を通じて、発生している問題を確認し、サードパーティのメカニズムを介して潜在的にアラートを出すことができます。


1
クリティカルログと非クリティカルログを区別し、時間経過ごとのログ数の重要性に注目して+1。フォールバックロギングを何年も使用している間、これらの2つの側面について考えていなかったことに失望しています。
Arseni Mourzenko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.