[asp.net-mvc] एएसपी.नेट एमवीसी [हैंडलरर] विशेषता के साथ काम करने के लिए ELMAH कैसे प्राप्त करें?


3 Answers

क्षमा करें, लेकिन मुझे लगता है कि स्वीकृत उत्तर एक ओवरकिल है। आपको बस इतना करना है:

public class ElmahHandledErrorLoggerFilter : IExceptionFilter
{
    public void OnException (ExceptionContext context)
    {
        // Log only handled exceptions, because all other will be caught by ELMAH anyway.
        if (context.ExceptionHandled)
            ErrorSignal.FromCurrentContext().Raise(context.Exception);
    }
}

और फिर इसे पंजीकृत करें (ऑर्डर महत्वपूर्ण है) Global.asax.cs में:

public static void RegisterGlobalFilters (GlobalFilterCollection filters)
{
    filters.Add(new ElmahHandledErrorLoggerFilter());
    filters.Add(new HandleErrorAttribute());
}
Question

मैं अपने एएसपी.नेट एमवीसी अनुप्रयोग में त्रुटियों को लॉग करने के लिए ELMAH का उपयोग करने की कोशिश कर रहा हूं, हालांकि जब मैं अपने नियंत्रकों पर [हैंडलरर] विशेषता का उपयोग करता हूं तो ELMAH होने पर किसी भी त्रुटि को लॉग नहीं करता है।

जैसा कि मैं अनुमान लगा रहा हूं क्योंकि ELMAH केवल अनचाहे त्रुटियों को लॉग करता है और [HandleError] विशेषता त्रुटि को संभालने में सक्षम होती है इसलिए इस प्रकार इसे लॉग करने की आवश्यकता नहीं होती है।

मैं कैसे संशोधित करूं या विशेषता को संशोधित करने के बारे में कैसे जाउंगा ताकि ELMAH यह जान सके कि कोई त्रुटि हुई और लॉग इन करें ..

संपादित करें: मुझे यह सुनिश्चित करने दें कि हर कोई समझता है, मुझे पता है कि मैं उस विशेषता को संशोधित कर सकता हूं जो मैं पूछ रहा हूं ... ELMAH हैंडलर विशेषता का उपयोग करते समय बाईपास हो जाता है जिसका अर्थ यह नहीं होगा कि यह एक त्रुटि थी क्योंकि इसे संभाला गया था पहले से ही विशेषता से ... मैं जो पूछ रहा हूं वह ईएलएमएएच को त्रुटि देखने और इसे लॉग करने के लिए एक तरीका है, हालांकि विशेषता ने इसे संभाला है ... मैंने चारों ओर खोज की है और इसे लॉग इन करने के लिए मजबूर करने के लिए कॉल करने के लिए कोई भी तरीका नहीं दिख रहा है त्रुटि....




आप उपरोक्त कोड ले सकते हैं और एक कस्टम नियंत्रक फैक्ट्री पेश करके एक कदम आगे जा सकते हैं जो प्रत्येक नियंत्रक में हैंडलरर विथइल्मा विशेषता को इंजेक्ट करता है।

अधिक जानकारी के लिए एमवीसी में लॉग इन करने पर मेरी ब्लॉग श्रृंखला देखें। पहला लेख एल्माह स्थापित करने और एमवीसी के लिए चल रहा है।

लेख के अंत में डाउनलोड करने योग्य कोड का एक लिंक है। उम्मीद है की वो मदद करदे।

http://dotnetdarren.wordpress.com/




एक पूरी तरह से वैकल्पिक समाधान एमवीसी HandleErrorAttribute उपयोग नहीं करना है, और इसके बजाय एएसपी.Net त्रुटि हैंडलिंग पर निर्भर है, जिसे एल्माह के साथ काम करने के लिए डिज़ाइन किया गया है।

आपको App_Start \ FilterConfig (या Global.asax) से डिफ़ॉल्ट वैश्विक हैंडलरर एट्रिब्यूट को हटाने की आवश्यकता है, और फिर अपने Web.config में एक त्रुटि पृष्ठ सेट अप करें:

<customErrors mode="RemoteOnly" defaultRedirect="~/error/" />

ध्यान दें, यह एक एमवीसी रूटेड यूआरएल हो सकता है, इसलिए जब कोई त्रुटि होती है तो उपरोक्त त्रुटि ErrorController.IndexErrorController.Index कार्रवाई पर रीडायरेक्ट करेगा।




यह मेरी एमवीसी साइट कॉन्फ़िगरेशन के लिए बिल्कुल वही है!

मैंने कई OnException उदाहरणों को संभालने के लिए OnException विधि में थोड़ा संशोधन जोड़ा, जैसा कि आतिफ अज़ीज़ द्वारा सुझाया गया है:

ध्यान रखें कि आपको यह ध्यान रखना पड़ सकता है कि यदि एकाधिक HandleErrorAttribute उदाहरण प्रभावी हैं तो डुप्लिकेट लॉगिंग नहीं होती है।

मैं बस context.ExceptionHandled जांच करता हूं। अपवाद बेस क्लास को आमंत्रित करने से पहले, बस यह जानने के लिए कि किसी और ने वर्तमान हैंडलर से पहले अपवाद संभाला है या नहीं।
यह मेरे लिए काम करता है और अगर किसी और को इसकी आवश्यकता होती है तो मैं कोड पोस्ट करता हूं और पूछता हूं कि क्या कोई जानता है कि मैंने कुछ भी अनदेखा किया है।

उम्मीद है कि यह उपयोगी है:

public override void OnException(ExceptionContext context)
{
    bool exceptionHandledByPreviousHandler = context.ExceptionHandled;

    base.OnException(context);

    Exception e = context.Exception;
    if (exceptionHandledByPreviousHandler
        || !context.ExceptionHandled  // if unhandled, will be logged anyhow
        || RaiseErrorSignal(e)        // prefer signaling, if possible
        || IsFiltered(context))       // filtered?
        return;

    LogException(e);
}



Related