[asp.net-mvc] एएसपी.नेट एमवीसी में लॉगिंग त्रुटियां


Answers

आप Global.asax में ऑनरर इवेंट में हुक कर सकते हैं।

कुछ इस तरह:

/// <summary>
/// Handles the Error event of the Application control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Application_Error(object sender, EventArgs e)
{
    if (Server != null)
    {
        Exception ex = Server.GetLastError();

        if (Response.StatusCode != 404 )
        {
            Logging.Error("Caught in Global.asax", ex);
        }

    }


}
Question

मैं वर्तमान में अपवाद लॉग करने के लिए अपने एएसपी.नेट एमवीसी अनुप्रयोग में 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>

और नियंत्रक कार्रवाई में जो "पृष्ठ-नहीं मिला" यूआरएल को संभालता है, मैं अनुरोध किए जाने वाले मूल यूआरएल को लॉग करता हूं:

[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!"); %>

ऐसा प्रतीत होता है कि हैंडलरर विशेषता साझा फ़ोल्डर में मेरे Error.aspx पृष्ठ पर इसे सही ढंग से दोबारा शुरू कर रही है, लेकिन यह निश्चित रूप से मेरे बेसकंट्रोलर के ऑनएक्शन एक्स्क्टेड विधि द्वारा पकड़ा नहीं जा रहा है। मैं सोच रहा था कि मैं शायद लॉगिंग कोड को Error.aspx पेज पर ही डाल सकता हूं, लेकिन मुझे इस स्तर पर त्रुटि जानकारी को पुनर्प्राप्त करने के बारे में अनिश्चितता है।




क्या आपने हैंडलरर विशेषता को विस्तारित करने के बारे में सोचा है? इसके अलावा, स्कॉट के पास नियंत्रकों / कार्यों पर फ़िल्टर इंटरसेप्टर के बारे में एक अच्छा ब्लॉग पोस्ट here




आप HttpContext.Error की जांच करने का प्रयास कर सकते हैं, लेकिन मुझे इस पर यकीन नहीं है।






Related