تصفية استثناءات مشورة من رسائل خطأ Elmah
سؤال
لقد قمت بتطبيق طريقة غلاف حول إشارات خطأ 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();
}
}