web-dev-qa-db-ja.com

本番環境でユーザーアクションをログに記録するためのベストプラクティス

ユーザーが次のような場合など、実稼働環境でさまざまなものをログに記録することを計画していました。

  • ログイン、ログオフ
  • プロフィールを変更
  • アカウント設定を編集
  • パスワードの変更...など

これは、制作環境で実行するのに良い方法ですか?また、これらすべてをログに記録するための良い方法は何ですか。現在、次のコードブロックを使用してログに記録しています。

public void LogMessageToFile(string msg)
        {

            System.IO.StreamWriter sw = System.IO.File.AppendText(
                GetTempPath() + @"MyLogFile.txt");
            try
            {
                string logLine = System.String.Format(
                    "{0:G}: {1}.", System.DateTime.Now, msg);
                sw.WriteLine(logLine);
            }
            finally
            {
                sw.Close();
            }
        }

これは本番環境で問題ありませんか?私のアプリケーションは非常に新しいので、数百万のユーザーがすぐに何かを期待することはなく、Webサイトでのアクションを追跡するためのベストプラクティスを探しています。

22
anthonypliu

これは質問への直接の回答ではなく、より詳細なものです。

新しいアプリを起動するときは、ログに記録することをお勧めしますeverythingユーザーは次のことを行います。ログイン、ログアウト、a **、すべてをスクラッチします。 Webベースの場合は、 ヒートマップ を使用して、マウスの動作を確認してください。

70年代後半のゼロックスで BravoXプロジェクト にいたとき、ピクセル単位のマウスの動きを記録して、ユーザーがWYSIWYGエディターと呼ばれるこの奇妙なものをどのように使用するかを理解しました。昼食時にユーザーセッションの再生を見ます。それは非常に有益でした。チャーリーブラウニングと呼ばれる使用パターンを発見しました。ユーザーはテキストを選択して斜体にします...その後、元に戻します...そして前後にやり直します。彼らがこのことを感情的なレベルで理解しようとしていたことがわかりました。したがって、私たち(Greg Kusnikは、メモリが機能する場合はコードを実行しました)は、この動作を正確にサポートするために特定の最適化を行いました。

録音がなければ、これを行うことは考えられなかったでしょう。

30
Peter Rowell

私があなたであり、テキストファイルへの書き込みにこだわっていた場合は、 log4net を使用して、特定の "UserActions.log"ファイルにログインします。このようにして、通常のロギングを混乱させることはありません。 log4net(またはその他のロギングフレームワーク)を使用することで、ホイールの再発明を回避し、ローリングファイルアペンダー、警告/エラー/デバッグ/情報コード、バッチファイルの書き込みなどを活用できます。あらゆる生産レベルのアプリケーション。

しかし実際には、このすべての情報をデータベースに格納する方がおそらく良いでしょう。データベースを使用すると、データベースの並べ替え、集計、統計の作成が簡単になります

9
devshorts

ログファイルは、システムエラーのデバッグ情報を取得するために使用されます。 2.いたずらのためにユーザーの活動を調査する、または3.見に行けないときに人々がシステムをどのように使用するかを理解する。それを念頭に置いて:

  • アプリケーションの起動時にログ環境(環境変数、その他の設定など)。これは問題のデバッグに役立ちます。
  • 各リクエストのユーザーとアクション(URLの異なる部分)をログに記録します。
  • パスワードの各リクエスト[〜#〜] [〜#〜]を除くすべてのパラメーターをログに記録します。私はログの各パラメータの周りに区切り文字を入れたいです。 phone{(999)999-9999} email{[email protected]}。パスワードは、データベースのどこか以外の場所(---)に書いてはいけません。暗号化された安全なハッシュ関数で、ユーザーごとに一意のソルトと複数回のハッシュを使用します(脚注を参照)。
  • ログインするときは、ユーザーのIPアドレス、ユーザーID、名前、失敗したログインの数、おそらくブラウザー、おそらくCookieセッションIDをログに記録する必要がありますが、パスワードは記録しないでください。
  • ログインページ[〜#〜]および[〜#〜]にパスワードの変更ページを記録しないでください。また、秘密の質問や回答を記録しないでください。その機能を持っています。その他のパスワードや暗号化キーはログに記録しないでください。これらのパラメーターのログに6つ星のようなものを書き込むことをお勧めします。これにより、このデータを抑制したことを覚えていることがわかります。
  • 各リクエストを処理するのにかかる合計時間を記録したい:Done: 49ms
  • セッション状態の変更をログに記録したい。これらはまれなはずです。
  • 他の人が言ったように、ファイルへのロギング用に優れたロギングライブラリがあり、データベースへのロギングについては不明です。
  • ログを安全に保管します。パスワードがなくても、個人を特定できる情報( セーフハーバー を参照)について、州、連邦、および国際法があり、ログデータを機密にしています。
  • バックアップを取る。毎晩フルドライブバックアップを実行する場合は、新しいサーバーにアップグレードする前に、必ず別の場所にバックアップしてください(この方法を教えてください)。

その他のヒント

脚注:誰かをログインさせるには、提供されたパスワードを同じハッシュアルゴリズムでハッシュし、そのユーザーの元のハッシュからソルトをハッシュします。提供されたパスワードのハッシュがデータベースに保存されたパスワードハッシュと一致する場合、それらはログインします。これを機能させるには、パスワードの文字セットを定義し、Unicode置換文字およびセット外の他の文字を禁止する必要があります。

9
GlenPeterson

データベースを使用しているかどうかは指定しませんが、データベースがSQL Serverである場合は、 AutoAudit と呼ばれるものを追加して、データとのすべての対話を自動的にログに記録できます。監査するオブジェクトのみを指定してください。

しかし、いずれにしても、メンテナンスの悪夢になるので、追跡を手動でコーディングすることはしません。

また、ロギングについては、独自にロールバックせず、 Enterprise Library Logging または Log4Net などを使用してください。

2
Richard

ただの一般的なアドバイスです。質問に直接関連しているとは限りません。

ログを何に使用するかによって異なりますか?ほとんどの場合、ログは本番環境で使用され、エラーの原因となる操作を検出します。ユーザーアクションを追跡するためにそれらを保持している場合、それはログの一部ではありません。それは製品のサーバー側の機能でなければなりません。これらのものは間違いなく後の研究のためにデータベースに入れる必要があります。ただし、「一部のテキストが空であるためエラーが発生しました」などのサーバー側のログは、機能の一部ではありません。これらのものはファイルシステムに入れる必要があります。それらには次の内容が必要です:-user_id、error_number、error_text、file_name、function_name、thread_id、system_date_time、およびその他のコンテキスト。

今私はファイルのログについて話しているだけです。

1)それらを非同期に保ちます。 I/O操作にはコストがかかります。

2)関数ではなくクラスとしてそれらを設計します。将来の変更は簡単です。

3)可能であれば、それらをシングルトンにしてください。シングルトンはマルチスレッドでは難しいため、適切に設計してください。

4)ロガーとLoggeeの間の相互作用をシンプルに保つことも良いでしょう。ほとんどの場合、実際のmessage_textよりもmessage_numberを送信し、ロガーにその番号からメッセージを取得させます。これは、後で汎用ログ形式を変更する場合に役立ちます。

通常、ロガーと、ログに記録する必要があるものも、設計の一部にする必要があります。すべての関連情報が適切に記録されるようにするために、設計に変更があったケースを見てきました。

2
Manoj R

Log4Netを試してください。ファイルやデータベースにログインできます。 チュートリアル

すべてのプロジェクトでLog4Netを使用しています。

1
bittech

ログファイルを使用すると、いくつかの問題が発生します。まず、複数のプロセスがファイルにアクセスしようとすると、エラーが発生する場合があります。また、システムの実行中にファイルを循環または消去しようとすると、問題が発生することがあります。これを回避するには、データベースを使用します。

したがって、ステップ1はデータベーステーブルを作成することです。次のフィールドをお勧めします。
* ユーザーID
*アクション(ログオン、fooの削除など)
*一部の説明文(ここではnullを許可)
*タイムスタンプ

手順2、userID、アクション、および説明文の入力を含むストアドプロシージャを作成します。現在の時刻を使用してタイムスタンプを作成するだけです。

ステップ3、便利な共有ライブラリにロギングメソッドを記述します。これにより、どこにでも簡単に含めることができ、必要に応じてそのメソッドを呼び出すことができます。ログレベルのフラグロジックを使用して、ログに記録される内容を変更することもできます。

手順4、メンテナンスルーチンを作成して、時々ログテーブルから古いメッセージを消去します。おそらく、Xより古い場合は削除し、定期的なDBメンテナンス(インデックスの再構築など)の一環として、毎週などを実行します。

これを一度ビルドすると、他のプロジェクトに含まれるコードを使用できるようになります。

0
adam f