質問

この質問を投稿する前に、いくつかの検索を試みました。重複している場合はお知らせください。削除します。

私の質問は、Webアプリケーションで生成されたエラーを処理する適切な方法を中心にしています。現在、log4jを介してすべてを記録しています。エラーが発生した場合、<!> quot;エラーが発生しました。 IT部門は通知を受けており、できるだけ早くこれを修正するように働きます<!> quot;画面の右側。これはユーザーに何も伝えません...しかし、エラーを再現しようとしても開発者に何も伝えません。エラーログフォルダーに移動して、このエラーを見つけてください。フォルダーには、先週のログがいっぱいです。エラーが発生するたびに、そのユーザーに対して1つのログファイルが作成され、エラーの処理に割り当てられたITスタッフに電子メールが送信されます。このメールにはログファイル名は記載されていませんが、ログファイルに書き込まれているのと同じエラーテキストのコピーです。

したがって、Aliciaが7:15に何か問題を抱えていて、その瞬間に他に10個のエラーが発生した場合、各ログファイルを調べて彼女を見つけなければなりません。

同僚に提案したのは、データベースにエラーログテーブルを追加することです。これにより、エラーごとにテーブルにレコードが書き込まれ、エラーの対象、エラー、発生したページなどが記録されます。ページに<!> quot; Error Reference Id(1337)のようなメッセージが記録され、適切なITスタッフに通知されたことを示します。この参照IDは、今後の使用のために手元に置いてください<!> quot;。電子メールを受け取ると、エラーのIDがわかりやすく表示されます。または、ユーザーが永続的な場合、ユーザーはIDを使用して連絡でき、エラーをかなり迅速に見つけることができます。

エラーログをどのように設定しますか?ところで、私たちのシステムは、SQL Serverデータベースに接続するJavaサーブレットを使用しています。

役に立ちましたか?

解決

同様の質問こちらに答えましたが、その答えをあなたの質問。

この目的のために requestID を使用します-処理の最初に(フィルターで)各着信(HTTP)要求に要求IDを割り当て、すべてのログ行に記録します。それらのログを後でそのIDで簡単にgrepし、関連するすべての行を見つけることができます。

すべてのログステートメントにそのIDを追加するのが非常に退屈だと思う場合、あなただけではありません-Javaロギングフレームワークはマップされた診断コンテキスト(MDC)(少なくともlog4jおよびlogbackにはこれがあります)。

RequestIDは、エラーが発生した場合に(既に提案したように)吐き出すための便利な参照番号としても機能します。ただし、他の人がコメントしているように、それらの詳細をデータベースにロードすることは賢明ではありません-ファイルシステムをよりよく使用してください。または、最も単純なアプローチはrequestIDを使用することです。エラーが発生したときに特別なことをする必要はありません。正しいログファイルを見つけ、そのファイル内を検索するのに役立ちます。

1つのrequestIDはどのように見えますか?

次のパターンを使用します。

  

<!> lt; instanceName <!> gt;:<!> lt; currentTimeInMillis <!> gt;。<!> lt; counter <!> gt;

Inは次の変数で構成されます。

  • instanceName は、特定のデプロイメント環境で特定のJVMを一意に識別します/。
  • currentTimeInMillis は一目瞭然です。人間が読める形式<!> quot; yyyyMMddHHmmssSSS <!> quot;で表現することを選択したため、そこからリクエストの開始時刻を簡単に読み取ることができます(SimpleDateFormatはスレッドセーフではないため、同期する必要があります)または、リクエストごとに新しいものを作成します)。
  • counter はその特定のミリ秒のリクエストカウンターです-まれに、1ミリ秒で複数のリクエストIDを生成する必要がある場合があります

ご覧のとおり、ID形式は currentTimeInMillis.counter の組み合わせが特定のJVMで一意であることが保証され、ID全体がグローバルに一意であることが保証されるように設定されています(まあ、<!> quot; global <!> quot;の真の意味ではありませんが、データベースや他の中央ノードを関与させる必要なしに、私たちの目的にとって十分にグローバルです)。また、 instanceName 変数を使用すると、そのリクエストを見つけるために後で調べる必要があるログファイルの数を制限できます。

それから、最後の質問: <!> quot;これは単一のJVMソリューションではうまくいきますが、それをいくつかのJVMに拡張して、いくつかのネットワークプロトコルで通信するにはどうすればよいですか?<!> quot;

Spring Remoting を使用してリモート処理の目的で、カスタム RemoteInvocationFactory (コンテキストからリクエストIDを取得し、 RemoteInvocation属性)および RemoteInvocationExecutor (属性からリクエストIDを取得し、他の診断コンテキストに追加します) JVM)。

プレーンRMIまたは他のリモート処理方法でどのように実装するかわからない。

他のヒント

複数のサーバーが実行されており、各サーバーがそれ自体にログメッセージを残している場合、それらをトレースすることは非常に困難です。そのため、誰かまたはツールが収集し、時間順に並べ替える必要があります。 すべてのメッセージが送信される中心点を確保するのに良い方法です。

考えられる解決策は、エラーページに「何にでもメールを送信」リンクを含めることです。ユーザーがこの電子メールをクリックすると、電子メールの本文がいくつかの空白行で始まり、次のようなものが続く場合があります。

  

----この行の下の情報は変更しないでください。---

     

エラーの詳細

このリンクから苦情を申し立てたユーザーは、必要な情報を自動的に送信します。エラーを再現している場合は、エラーメッセージにすばやくアクセスできます。電子メールを送信するためのフォームを用意して、ユーザーに表示されないようにすることもできます(一部にとっては重要な場合もあります)が、少なくとも電子メールを送信できるシステムに依存しています。

実際、このようなエラーページにHTMLコメントでエラーの詳細を印刷すると、いつでも自分で確認できるので便利です。

この種の情報をDBに保存するのは好きではないということに、上記のdavidに同意します。

ロギングの戦略については、ロギングのベストプラクティスをご覧ください。

私はあなたが提案しているようなアプローチ(dbにログを記録する)を過去に使用しましたが、これは非常に役に立ちました。

SQLを使用してエラーを取得するだけでなく、最も頻繁に発生するエラーのレポートを生成して、最初にそれらに対応することもできます。

私たちが行った設計では、等しいスタックトレースは同じレコードに属します(それらはまったく同じ場所で作成されているため)

そのデータベースをプールする小さなアプリがあり、それから前の週の残りの時間と完全に無視される電子メールを取得する代わりに、新しい例外が生成されることがわかりました。

もちろん、このデータベース設計は、使用しているアプリケーションに非常に固有であり、追加の識別が可能でした。ソフトウェアバージョン、ビルド、入力パラメーターなどもありました。

時間が経つにつれて、システム管理者は、各種類の例外の処理方法を把握し、それに応じて先に進みます。

しかし!とにかくあなたのアプリケーションはそれほど大きくないかもしれません。おそらく、ログファイルを解析するだけで同じことができます。

データベースにエラーログを保存するという考えに反対します。ロギングシステムはできるだけシンプルで、ログレコードの書き込みに100%必要ではないコンポーネントを使用しないようにする必要があります。

DBにログインすると、非常に複雑になることがあります。データベース関連のエラーをログに記録する際に問題が発生する可能性があります(DBが応答しないために発生したエラーをログに記録する方法、たとえば、負荷が大きいかインフラストラクチャエラーのため);私が見る他の問題は、ロギングなどのために別個のトランザクションを持つ必要性の可能性です。

一方、エラーの参照IDを持つことは悪い考えではありませんが、これはロギングシステムの複雑さを増すことも意味します(たとえば、アプリケーションのすべてのレイヤーを通じて参照IDを伝播する方法)エラーが発生した場合?)

私が関係しているプロジェクトでは、一般的なガイドラインはエラーを可能な限り詳細に記録し、可能な限り多くのコンテキスト情報を含めることです(ログを書き込むには、通常、「従来の」アプローチを使用します-log4jまたはsimillar )。通常、これは負荷の高いシステムでもうまく機能します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top