3

ajax リクエストを含む Web アプリケーションの http リクエストをログに記録し、後で戻って「このリクエストが行われた回数と、平均して完了するまでにかかった時間を知りたい」とクエリできるようにする最良の方法は何ですか? 、または「平均時間の長い上位 5 件のリクエストを表示してください」

現在の本番データベースとは別のデータベースを使用してこれらのことをログに記録し、これらすべての挿入が IO の速度低下を引き起こすのを防ぎますか、それとも実際には大きな影響を与えないでしょうか?

リクエストをまとめて DB にプッシュしますか、それともリクエストごとに 1 つの挿入を行いますか?

次のようなアプリケーションロジックで各リクエストハンドラーをラップする以外に、このリクエストログインをタイミングで追加するより良い方法はありますか?

start = CurrentTime()
/* request handler code */
end = CurrentTime()
Insert(requestName, start, (end - start))
4

3 に答える 3

4

この目的のために、Web サーバーのログを使用できるはずです。Apache と IIS の両方のログは、URL、クエリ文字列、応答コード、および期間をキャプチャします。AJAX リクエストが HTTP POST 経由でデータを受信する場合、そのデータが重要な場合は、そのデータをキャプチャするように Web サーバーの構成を変更する必要があります。次に、ログ分析に私が見つけた最適なツールはMicrosoft の Log Parserです。これは、SQL 構文を使用して大きなファイルを操作し、ユーザーが求めている種類の質問に対する回答を計算するのに優れています。

ただし、自分で作成する場合は、何らかのローカル ロギングを使用してください。また、 log4Jなどのロギング フレームワークを使用します。これは、ディスク書き込みをバッファリングして I/O を最小限に抑え、ログ ファイルをロールし、古いファイルを削除するのに十分なほどスマートです。これは、クラスター化されたサーバーのよりスケーラブルなアプローチです。そうしないと、それぞれがデータベースに絶えずアクセスします。データをテーブルに入れたい場合は、たとえば1時間または1日に1回、バッチ処理にします。

于 2011-05-28T10:18:55.373 に答える
2

Google アナリティクスの優れた使用例のようです (特に、イベント トラッキングを参照してください)。

それができない場合は、スケーラビリティについて早い段階で検討してください。

  1. サービスを提供しているサーバー ページ内からログを記録しないでください。これは、キャッシュに対して機能する可能性があるためです。スクリプトまたは 1x1 画像を使用してパラメーターを投げ込み、それを別の (キャッシュされていない) プロセスで動作させます。

  2. DB ベースにすることになった場合は、ハード ドライブを叩かないでください。メモリベースのストレージを使用して統計情報を保存し、定期的にその内容をデータベースに永続化します。(Google が最初に開いたとき、Google Analytics は圧倒されていたことを思い出してください。)

于 2011-05-23T15:13:26.603 に答える
1

単にリクエストのタイミングを追跡して DB に保存することが目標であるが、挿入によってリクエストが滞る可能性を避けたい場合は、 MongoDBなどの高速挿入をサポートする DB を使用する必要があります。接続文字列を strict mode = off に微調整すると、挿入は基本的に非同期になります。

良い出発点は次のとおりです。

NoSQ LMovement、LINQ、および MongoDB

ASP.NET MVC のみでこれを行っている場合は、それをカスタム アクション フィルターと組み合わせて、コントローラー コードからも取得できます。カスタム ASP.NET モジュールを使用してそれを実現し、IIS 7 以降ですべての要求 (ASP.NET 以外のものも含む) を取得することもできると思います。

NoSQL / MongoDB が気に入らない場合は、ブロッキング呼び出しを行うのではなく、挿入に SqlCommand.BeginExecuteNonQuery を使用できます。ただし、本番と同じDBに挿入すると、競合が発生する可能性があります。

于 2011-05-26T19:46:34.087 に答える