ELMAH Log обрабатывает исключения - PullRequest
0 голосов
/ 03 мая 2018

Я использую ELMAH, чтобы попытаться зарегистрировать обработанные исключения (те, которые возникают при попытках перехвата). Однако я не могу заставить ELMAH регистрировать любые исключения, возникающие при попытке перехвата.

Вот мое действие:

    [ValidateAntiForgeryToken]       
    public async Task<ActionResult> Login(LoginViewModel model) {

        try {
            throw new Exception("Log me elmah");
        }
        catch (Exception e) {
            ModelState.AddModelError("", "Something unexpected happened, please try again.");
            return View(model);
        }
    }

Я следовал советам обоих здесь: https://docs.elmah.io/elmah-and-custom-errors/ и здесь: Как заставить ELMAH работать с атрибутом ASP.NET MVC [HandleError]?

Но мой ElmahExceptionLogger срабатывает только для необработанных исключений.

Вот мой ElmahExceptionLogger:

public class ElmahExceptionLogger : IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        if (filterContext.ExceptionHandled) {
            ErrorSignal.FromCurrentContext().Raise(filterContext.Exception);
        }
    }
}

Вот мой global.asax:

  public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);        
        }      
    }

Вот мой метод регистрации глобальных фильтров:

 public class FilterConfig {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
            filters.Add(new ElmahExceptionLogger());
            filters.Add(new HandleErrorAttribute());



            /*Append no cache to all actions in all controllers so we don't cache any pages, I dont particularly like it because it means an increased server load
            However there are reasons to this; The first being data gets updated regularly and we want users to have the most up-to-date data
            And also you can press back after logging out to get to the cached page before. It can be overridden per action if needed */
            filters.Add(new OutputCacheAttribute {
                VaryByParam = "*",
                Duration = 0,
                NoStore = true
            });
        }
    }

Кто-нибудь знает, как заставить ELMAH регистрировать мои исключения в try catch?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

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

Сначала я создал расширение для класса Exception:

    Imports Elmah
    Imports System
    Imports System.Web
    Imports System.Runtime.CompilerServices


Public Module ElmahExtension

    <Extension()>
    Public Sub LogToElmah(ex As Exception)


        If HttpContext.Current Is Nothing Then

            ErrorLog.GetDefault(Nothing).Log(New [Error](ex))
            Dim req = New HttpRequest(String.Empty, "https://YOURWEBSITE", Nothing)
            Dim res = New HttpResponse(Nothing)
        Else
            ErrorSignal.FromCurrentContext().Raise(ex)
            ErrorLog.GetDefault(HttpContext.Current).Log(New [Error](ex))
        End If
    End Sub
End Module

Чтобы использовать его, вы можете сделать это:

   Try

      YOUR CODE HERE

  Catch
      ex.LogToElmah()
  End Try

Это передаст объект исключения в ELMAH и зарегистрирует ошибку.

Так что не совсем автоматически, но проще. Особенно, если вы используете что-то вроде ReSharper для создания ярлыка кода с включенным «ex.LogToELMAH».

0 голосов
/ 03 мая 2018

Конечно, это срабатывает только для необработанных исключений. Эти фильтры работают только для ошибок, которые могут всплыть (то есть, необработано ). Если вы хотите записать обработанное исключение, вам нужно поместить эту логику ErrorSignal.FromCurrentContext().Raise() в ваш блок catch.

catch (Exception e)
{
    ModelState.AddModelError("", "Something unexpected happened, please try again.");
    ErrorSignal.FromCurrentContext().Raise(e);
    return View(model);
}

Если вы обнаружите, что делаете это много, тогда я предлагаю вам отключиться, используя Элму. Elmah не является общей структурой ведения журналов, она ориентирована на необработанные ошибки. Было бы лучше использовать систему журналирования, такую ​​как Serilog или Nlog , а затем передавать ее в специализированную систему, такую ​​как Seq .

...