मैं वर्तमान में अपवादों को लॉग करने के लिए अपने ASP.NET MVC एप्लिकेशन में log4net का उपयोग कर रहा हूं। जिस तरह से मैं यह कर रहा हूं वह मेरे सभी नियंत्रकों को बेसकंट्रोलर वर्ग से विरासत में मिला है। BaseController के OnActionExecuting ईवेंट में, मैं कोई भी अपवाद लॉग करता हूँ जो हो सकता है:
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);
}
}
यह बहुत अच्छा काम करता है यदि नियंत्रक क्रिया के दौरान एक अनहेल्दी अपवाद हुआ।
404 त्रुटियों के लिए, मेरे पास मेरे web.config में एक कस्टम त्रुटि है जैसे:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
और नियंत्रक क्रिया में जो "पृष्ठ-न-पाया" url को संभालता है, मैं अनुरोध किए जा रहे मूल url को लॉग करता हूं:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
और यह भी काम करता है।
समस्या यह है कि मैं कैसे .aspx पृष्ठों पर खुद को त्रुटियों को लॉग करने के लिए है। मान लें कि मेरे पास पृष्ठों या कुछ इनलाइन कोड में से एक पर एक संकलन त्रुटि है जो अपवाद को फेंक देगा:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
ऐसा प्रतीत होता है कि HandleError विशेषता सही ढंग से साझा किए गए फ़ोल्डर में मेरे Error.aspx पृष्ठ पर इसे पुनः भेज रही है, लेकिन यह निश्चित रूप से मेरे BaseController की OnActionExecuted विधि द्वारा नहीं पकड़ा जा रहा है। मैं सोच रहा था कि मैं शायद Error.aspx पेज पर लॉगिंग कोड डाल सकता हूं, लेकिन मैं इस स्तर पर त्रुटि जानकारी को पुनर्प्राप्त करने के तरीके के बारे में अनिश्चित हूं।