Entity Frameworkを介してT-SQLデータベースによって提供されるデータストレージを使用して、ASP.NET MVC 4を使用してWebアプリを構築しています。私は監査ログを統合しており、人間が判読できるアクションの要約を提供したいと考えています。これにより、「ユーザー Bob がログインしました」、「ユーザー Alice 」などの明確なステートメントを使用してわかりやすいログ ビューを表示できます。更新記事「Foo」」など
現在、監査レコードは次のもので構成されています。
- GUID
- タイムスタンプ
- ユーザーID
- アクションカテゴリ(コントローラ名)
- action (アクションメソッド名)
- IsError (ブール値。true は、これがエラーの記録であるか、このアクションが正常に完了しなかったことを意味します)
- シリアル化された詳細の塊
現時点では、私のロギングは実装するカスタム属性を使用していますIActionFIlter
。メソッドはOnActionExecuting()
試行されたアクションをログに記録し (URL、パラメーターなどを詳細 blob にシリアル化)、OnActionExecuted()
メソッドは戻り、エラーがない場合は IsError を true に設定し、返された結果または例外をエラー メッセージやスタック トレースなどと共に追加します。詳細へ。説明文字列用に別の列を追加したいのですが、きちんとした方法がわかりません。
私が得た最も遠いのは、「User $user logged in」のような文字列を属性に渡し、ログメソッドで文字列をスキャンして $ 文字を探し、その単語をキー値が一致するパラメーター辞書の何かに置き換えることでした単語 (マイナス $ 文字)。これは少し制限されています。例えば記事をID番号で保存する場合、「ユーザー18が編集した記事37」が一番管理しやすいです。ユーザー名や記事のタイトルを取得する実際の方法はありません。コンパイル時に組み込まれているため、インスタンスデータを属性に渡すことはできません。また、ロギングメソッドがその種のデータを取得するためにあらゆる種類のデータベース呼び出しを行うことを本当に望んでいません。 (または少なくとも本当の苦痛)単一の汎用ロギング方法を持つこと。
これに代わる方法は、静的な監査ログ クラスをAuditRecord.WriteLog(foo);
用意し、さまざまな種類のアクションを記述するために使用 (または継承) できる何らかの種類の記述子クラスを使用して、あらゆる場所で何かを呼び出し、すべてのパラメーターを格納し、生成することです。必要に応じて説明文字列を追加しますが、私にはエレガントではないようです。[AuditLog]
メソッドの上にタグを付けるだけで、それが記録されることを知ることができるのが本当に気に入っています。
コントローラーとアクション名を大きな switch ステートメントで使用して正しい文字列テンプレートを選択するなど、膨大な量の条件付きロジックは避けたいと思います。ロギングメソッドで記事のタイトルなどを把握できればOKです。これを行うためのきちんとした簡単な方法はありますか?