ASP MVCアプリ?(ActionFilters/HTTPModules)でユーザーアクティビティをログに記録するための適切な戦略はありますか?.
最後のユーザーアクティビティ(StackOverflowの「23分前に表示」のような)、使用されたページとコントローラー、さらにクリックされたボタンやリンクのようなもの。
ELMAHをインストールしましたが、私が知る限り、エラーログ用です。
PD:GoogleAnalyticsはオプションではありません。
PostSharp アスペクトを使用してロギングを実行してみると、マルチキャスト機能がそのような場合に役立つ可能性があります。それがオプションでない場合は、モジュールを実装するのがおそらく最も簡単です(パイプラインのその時点で必要なユーザー情報を取得できると仮定します)。
警告:これは2009年にMVC .NET RC1用に作成されたものであり、構文的に正しくない可能性があります。
アクションフィルター属性 これには最適です。コントローラーの上部にある[YourAttributeName]
を呼び出すだけです(または、他のコントローラーが継承するアプリケーションコントローラーがある場合は、それだけが必要です。アプリケーションで1回)。
例えば:
namespace the_name_space
{
[Log]
public class ApplicationController : Controller
{
この時点から、この属性は各アクションがコントローラーで実行される前に呼び出されます。同じ方法でアクションの直前に[Log]
を呼び出すことにより、アクションのみでこれを指定することもできます。
必要なロギング機能を取得するには、OnResultExecuting
とOnResultExecuted
をオーバーライドする必要があります。どちらもかなり自明です。
例えば:
public class LogAttribute : ActionFilterAttribute
{
protected DateTime start_time;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
start_time = DateTime.Now;
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
RouteData route_data = filterContext.RouteData;
TimeSpan duration = (DateTime.Now - start_time);
string controller = (string)route_data.Values["controller"];
string action = (string)route_data.Values["action"];
DateTime created_at = DateTime.Now;
//Save all your required values, including user id and whatnot here.
//The duration variable will allow you to see expensive page loads on the controller, this can be useful when clients complain about something being slow.
}
}
Rion Williams によるこれらの2つの投稿に偶然出くわしました。これは、これを行う非常に簡単な方法を説明しています。
ASP.NET MVC ActionFiltersを使用した監査証跡の実装
ASP.NET MVCでActionFiltersを使用して高度な監査証跡を作成する
リクエストのデータを保存し、そのデータをさらにフィルタリングできるため、高度な投稿は非常に優れています。
これを今すぐアプリに実装します。
@Roryのアイデアは素晴らしいです。 PostSharpはこれに必要なものです。これを、 ASP.net Health Monitoring と組み合わせることを検討してください。