2015-10-13 1 views
0

У меня есть несколько веб-приложений, построенных с использованием ASP.NET MVC 4/5. Все они используют Elmah для обработки ошибок, а также наши приложения получают много ошибок таймаута.Ловля всех исключений таймаута и регистрация их в Elmah с большим контекстом

Вот как он получает вход:

Операция ожидания истекло

System.ComponentModel.Win32Exception

Операция ожидания истекло

enter image description here

Я хочу записать что-то более значимое в теме. Что-то вроде - «DB Timeout - имя SP», которое может быть более полезным, иначе мне пришлось бы открыть каждый из этих журналов, прочитать трассировку стека и затем отладить.

Теперь, чтобы достичь этого, я знаю, что могу написать настраиваемое исключение, уловить все исключения тайм-аута db и перебросить мое настраиваемое исключение с именем хранимой процедуры.

Но это потребовало бы, чтобы я написал один и тот же кусок try catch в каждом из кода моего уровня сервиса.

Есть ли другой лучший способ, с помощью которого это можно было бы решить?

ответ

0

Это возможно благодаря функции фильтрации ошибок ELMAH. Я использовал это для remove sensitive form data from elmah.io.

Короче говоря вам нужно подключить в случае ErrorLog_Filtering (см ELMAH's documentation):

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args) 
{ 
    var httpContext = args.Context as HttpContext; 
    if (httpContext != null && args.Exception is TimeoutException) 
    { 
     var error = new Error(args.Exception, httpContext); 
     error.Message = "DB Timeout - SP name"; 
     ErrorLog.GetDefault(httpContext).Log(error); 
     args.Dismiss(); 
    } 
} 

Этот метод вызывается каждый раз, когда ELMAH хочет войти ошибку в журнале ошибок. Если есть HTTP-контекст, а исключенное исключение - это исключение TimeoutException (просто используя это в качестве примера, и вам нужно будет заменить это на исключение из БД), мы создаем новую ошибку из сброшенного исключения. Новая ошибка автоматически получает всю информацию из сброшенной ошибки. Запишите новую ошибку с помощью метода журнала и отпустите исходную ошибку с неправильным сообщением, вызвав Dismiss() в аргументах событий.

Смежные вопросы