3

私は.net/c#noob(長年のサーブレット/ Java開発者)です

mvcアプリケーションにログを追加する必要があります。パフォーマンス面でかなり安価で、構成が簡単なものにしたいと思います。

私が最初にやりたいことは、各着信コントローラーアクションをログに記録することです。単一のエントリポイントが存在する可能性があるため、すべてのコントローラのアクションメソッドにコード行を追加する必要がないことに気づきました。

私の見方では、[LogRequest]属性をコントローラー(私の場合はベースコントローラー)に追加してから、

public class LogsRequestsAttribute : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    { ... }
}

logrequest属性を処理するクラス。

また

私は次のようにベースコントローラーをオーバーライドすることができます:

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
       // perform some action here
    }
}

BaseControllerからすべてのコントローラーを継承します。

パフォーマンスの観点から、どちらが速いでしょうか?


また、パフォーマンスの観点から、実際のロギングメソッド呼び出しを、一度実行されて終了する非ブロッキングスレッドに入れることを検討しています。このアプローチの落とし穴はありますか?目標は、アプリを続行させ、ロギングメソッドがタスクを完了するのを待たないことです。

4

1 に答える 1

4

MVC3を使用している場合は、ベースコントローラーを必要とするのではなく、アクションフィルターをグローバルフィルターコレクションに追加することをお勧めします。アプリの起動時に、Global.asax( "MvcApplication")クラスで、次のような行が必要になります。

GlobalFilters.Filters.Add(new LogRequestsAttribute());

これにより、すべてのコントローラーアクションに対して実行されます。

パフォーマンスの観点からは、属性とベースコントローラーのメカニズムの間に大きな違いは見られないと思います。私は試していませんが、MVCパイプラインのアクションフィルター部分はベースコントローラーを持っているかどうかに関係なく実行されるため、ここでの実際の考慮事項はパフォーマンスではなく柔軟性です。より柔軟な設計は、ロギングをコントローラーから分離することです。

log4netのようなサードパーティのログソリューションを使用することを検討します。これはすでに速度が最適化されており、十分にテストされています。これにより、非同期ロギングスレッドなどを起動する必要がなくなります。アクションフィルターでlog4netにログインし、それを適切と呼んでください。それはまた、あなたがアペンダーごとに物事の非同期部分を行うことを可能にします-より多くの制御。非同期ロギングが必要な場合は、log4netアペンダーを、さまざまなロギング呼び出しをすべて非同期動作でラップするのではなく、非同期になるように記述してください。

于 2011-09-29T16:46:05.773 に答える