سؤال

لقد قمت بتطبيق طريقة غلاف حول إشارات خطأ Elmah ، حيث لا يُرى Elmah استثناءًا مرفوعًا إلا من قبل Elmah لتسجيلها والبريد ، لكن الآن أود تصفية هذه الاستثناءات المشار إليها فقط من البريد الإلكتروني ، ولكن لا يزال يسجلها. كيف يمكنني أن أفعل هذا؟

هذا هو غلاف بلدي البسيط:

    public void LogException(Exception exception)
    {
        ErrorSignal.FromContext(HttpContext.Current).Raise(exception);
    }

لقد فكرت في لف استثناء الإدخال في محددات مخصصة ، وتصفية أولئك الذين يخرجون من البريد ، ولكن بعد ذلك تصبح سجلاتي ممتلئة بالمشاهدات الدلالية ، وليس الاستثناءات الحقيقية.

أي أفكار أخرى من فضلك؟

هل كانت مفيدة؟

المحلول

يعمل تصفية Elmah بشكل رئيسي على أنواع الاستثناءات. سوف يسمح لي التصفية البرمجية بدراسة المعلومات التي تمت إضافتها إلى استثناء ، لكنني لم أصادف بعد نوع استثناء مع ElmahFilteringData الخاصية ، وأفضل عدم "غزو" الاستثناءات التي أريد تسجيلها. إليكم كيف أنجزت فقط إرسال Notificatins عبر البريد الإلكتروني لبعض الاستثناءات المشار إليها:

أولاً ، لدي استثناء خاص لفائف ، بحتة لإخبار Elmah بعدم إرسال إشعار بريد إلكتروني للاستثناءات من هذا النوع:

public class ElmahEMailBlockWrapperException: Exception
{
    public const string Explanation = "This is a wrapper exception that will be blocked by Elmah email filtering.  The real exception is the InnerException";
    public ElmahEMailBlockWrapperException(Exception wrappedException):base(Explanation, wrappedException) {}
}

بعد ذلك ، عندما أقوم بإثارة استثناء ، عادةً ما أريد تسجيل الدخول فقط وعدم إرسال بريد إلكتروني ، ولكن ربما أرسل عبر البريد الإلكتروني في بعض الأحيان ، أستخدم هذا الرمز في خدمة تسجيل الاستثناء الخاصة بي:

public void LogException(Exception exception, bool includeEmail)
{            
    if (includeEmail)
    {
        ErrorSignal.FromContext(HttpContext.Current).Raise(exception);
    }
    else
    {
        // Wrap the input exception in a special exception type that the Elmah email filter can block.
        var wrappedException = new ElmahEMailBlockWrapperException(exception);
        ErrorSignal.FromContext(HttpContext.Current).Raise(wrappedException);
    }
}

الآن ، في أحداث مرشح Elmah في Global.asax ، قمت بإلغاء تحديد استثناء تسجيله ، وإذا كان ملفوفًا ، فأرفضه من خط أنابيب إشعار البريد الإلكتروني:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    // If the exception was wrapped in a ElmahEMailBlockWrapperException exception to be blocked by the ErrorMail filter, the InnerException 
    // of the the ElmahEMailBlockWrapperException is the real exception to be logged, so we extract it, log it, and dismiss the wrapper.
    var ebw = e.Exception.GetBaseException() as ElmahEMailBlockWrapperException;
    if (ebw != null)
    {
        ErrorLog.GetDefault(HttpContext.Current).Log(new Error(ebw.InnerException));
        e.Dismiss();
    }
}

public void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e)
{
    // If the exception was wrapped, i.e. raised only to be logged by Elmah and not emailed, dismiss it.
    if (e.Exception.GetBaseException() is ElmahEMailBlockWrapperException)
    {
        e.Dismiss();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top