Saat ini saya menggunakan log4net di aplikasi ASP.NET MVC saya untuk mencatat pengecualian. Cara saya melakukan ini adalah dengan membuat semua pengontrol saya mewarisi dari kelas BaseController. Dalam acara OnActionExecuting BaseController, saya mencatat setiap pengecualian yang mungkin terjadi:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Log any exceptions
ILog log = LogManager.GetLogger(filterContext.Controller.GetType());
if (filterContext.Exception != null)
{
log.Error("Unhandled exception: " + filterContext.Exception.Message +
". Stack trace: " + filterContext.Exception.StackTrace,
filterContext.Exception);
}
}
Ini berfungsi dengan baik jika pengecualian yang tidak tertangani terjadi selama tindakan pengontrol.
Adapun kesalahan 404, saya memiliki kesalahan khusus yang diatur di web.config saya seperti ini:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
Dan dalam tindakan pengontrol yang menangani url "halaman-tidak-ditemukan", saya mencatat url asli yang diminta:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
Dan ini juga berhasil.
Masalah yang saya alami adalah bagaimana mencatat kesalahan yang ada di halaman .aspx itu sendiri. Katakanlah saya mengalami kesalahan kompilasi pada salah satu halaman atau beberapa kode sebaris yang akan memunculkan pengecualian:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Tampaknya atribut HandleError mengubah rute ini dengan benar ke halaman Error.aspx saya di folder Bersama, tetapi jelas tidak tertangkap oleh metode OnActionExecuted BaseController saya. Saya berpikir saya mungkin bisa meletakkan kode logging di halaman Error.aspx itu sendiri, tapi saya tidak yakin bagaimana cara mengambil informasi kesalahan di level itu.
sumber
Jawaban:
Saya akan mempertimbangkan untuk menyederhanakan aplikasi web Anda dengan menghubungkannya ke Elmah .
Anda menambahkan perakitan Elmah ke proyek Anda dan kemudian mengkonfigurasi web.config Anda. Kemudian akan mencatat pengecualian yang dibuat pada pengontrol atau tingkat halaman. Ini dapat dikonfigurasi untuk masuk ke berbagai tempat berbeda (seperti SQL Server, Email, dll). Ini juga menyediakan antarmuka web, sehingga Anda dapat menelusuri log pengecualian.
Ini adalah hal pertama yang saya tambahkan ke aplikasi MVC asp.net yang saya buat.
Saya masih menggunakan log4net, tetapi saya cenderung menggunakannya untuk mencatat debug / info, dan menyerahkan semua pengecualian ke Elmah.
Anda juga dapat menemukan informasi lebih lanjut di pertanyaan Bagaimana Anda mencatat kesalahan (Pengecualian) di aplikasi ASP.NET Anda? .
sumber
Anda dapat mengikuti acara OnError di Global.asax.
Sesuatu seperti ini:
sumber
Server
akan selalu bukan nol.if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) return;
MVC3
Buat Atribut yang mewarisi dari HandleErrorInfoAttribute dan menyertakan pilihan logging Anda
Tempatkan atribut di Global.asax RegisterGlobalFilters
sumber
Pernahkah Anda berpikir untuk memperluas atribut HandleError? Selain itu, Scott memiliki entri blog yang bagus tentang interseptor filter pada pengontrol / tindakan di sini .
sumber
Tampilan Error.aspx didefinisikan seperti ini:
HandleErrorInfo memiliki tiga properti: string ActionName string ControllerName Exception Exception
Anda harus bisa mengakses HandleErrorInfo dan juga Exception dalam tampilan.
sumber
Anda dapat mencoba memeriksa HttpContext.Error, tetapi saya tidak yakin akan hal ini.
sumber