Sekarang ada paket ELMAH.MVC di NuGet yang mencakup solusi yang ditingkatkan oleh Atif dan juga pengontrol yang menangani antarmuka elmah dalam perutean MVC (tidak perlu menggunakan axd itu lagi)
Masalah dengan solusi itu (dan dengan semua yang ada di sini) ) adalah bahwa salah satu cara penangan kesalahan elmah sebenarnya menangani kesalahan, mengabaikan apa yang mungkin ingin Anda atur sebagai tag customError atau melalui ErrorHandler atau penangan kesalahan Anda sendiri
Solusi terbaik IMHO adalah membuat filter yang akan bertindak di akhir semua filter lain dan mencatat peristiwa yang sudah ditangani. Modul elmah harus berhati-hati dalam mencatat kesalahan lain yang tidak ditangani oleh aplikasi. Ini juga akan memungkinkan Anda untuk menggunakan monitor kesehatan dan semua modul lain yang dapat ditambahkan ke asp.net untuk melihat peristiwa kesalahan
Saya menulis ini dengan reflektor di ErrorHandler di dalam elmah.mvc
public class ElmahMVCErrorFilter : IExceptionFilter
{
private static ErrorFilterConfiguration _config;
public void OnException(ExceptionContext context)
{
if (context.ExceptionHandled) //The unhandled ones will be picked by the elmah module
{
var e = context.Exception;
var context2 = context.HttpContext.ApplicationInstance.Context;
//TODO: Add additional variables to context.HttpContext.Request.ServerVariables for both handled and unhandled exceptions
if ((context2 == null) || (!_RaiseErrorSignal(e, context2) && !_IsFiltered(e, context2)))
{
_LogException(e, context2);
}
}
}
private static bool _IsFiltered(System.Exception e, System.Web.HttpContext context)
{
if (_config == null)
{
_config = (context.GetSection("elmah/errorFilter") as ErrorFilterConfiguration) ?? new ErrorFilterConfiguration();
}
var context2 = new ErrorFilterModule.AssertionHelperContext((System.Exception)e, context);
return _config.Assertion.Test(context2);
}
private static void _LogException(System.Exception e, System.Web.HttpContext context)
{
ErrorLog.GetDefault((System.Web.HttpContext)context).Log(new Elmah.Error((System.Exception)e, (System.Web.HttpContext)context));
}
private static bool _RaiseErrorSignal(System.Exception e, System.Web.HttpContext context)
{
var signal = ErrorSignal.FromContext((System.Web.HttpContext)context);
if (signal == null)
{
return false;
}
signal.Raise((System.Exception)e, (System.Web.HttpContext)context);
return true;
}
}
Sekarang, dalam konfigurasi filter Anda, Anda ingin melakukan sesuatu seperti ini:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//These filters should go at the end of the pipeline, add all error handlers before
filters.Add(new ElmahMVCErrorFilter());
}
Perhatikan bahwa saya meninggalkan komentar di sana untuk mengingatkan orang bahwa jika mereka ingin menambahkan filter global yang benar-benar akan menangani pengecualian itu harus pergi SEBELUM filter terakhir ini, jika tidak Anda mengalami kasus di mana pengecualian yang tidak ditangani akan diabaikan oleh ElmahMVCErrorFilter karena itu belum ditangani dan harus dicatat oleh modul Elmah tetapi kemudian filter berikutnya menandai pengecualian sebagai ditangani dan modul mengabaikannya, sehingga pengecualian tidak pernah membuatnya menjadi elmah.
Sekarang, pastikan pengaturan aplikasi untuk elmah di konfigurasi web Anda terlihat seperti ini:
<add key="elmah.mvc.disableHandler" value="false" /> <!-- This handles elmah controller pages, if disabled elmah pages will not work -->
<add key="elmah.mvc.disableHandleErrorFilter" value="true" /> <!-- This uses the default filter for elmah, set to disabled to use our own -->
<add key="elmah.mvc.requiresAuthentication" value="false" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.allowedRoles" value="*" /> <!-- Manages authentication for elmah pages -->
<add key="elmah.mvc.route" value="errortracking" /> <!-- Base route for elmah pages -->
Yang penting di sini adalah "elmah.mvc.disableHandleErrorFilter", jika ini salah, ia akan menggunakan handler di dalam elmah.mvc yang benar-benar akan menangani pengecualian dengan menggunakan HandleErrorHandler default yang akan mengabaikan pengaturan customError Anda
Setup ini memungkinkan Anda untuk mengatur tag ErrorHandler Anda sendiri di kelas dan tampilan, sambil tetap mencatat kesalahan tersebut melalui ElmahMVCErrorFilter, menambahkan konfigurasi customError ke web Anda. Mengkonfigurasi melalui modul elmah, bahkan menulis Error Handler Anda sendiri. Satu-satunya hal yang perlu Anda lakukan adalah ingat untuk tidak menambahkan filter yang benar-benar akan menangani kesalahan sebelum filter elmah yang telah kami tulis. Dan saya lupa menyebutkan: tidak ada duplikat di elmah.