Obecnie używam log4net w mojej aplikacji ASP.NET MVC do rejestrowania wyjątków. Sposób, w jaki to robię, polega na tym, że wszystkie moje kontrolery dziedziczą z klasy BaseController. W zdarzeniu OnActionExecuting BaseControllera rejestruję wszelkie wyjątki, które mogły wystąpić:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Log any exceptions
ILog log = LogManager.GetLogger(filterContext.Controller.GetType());
if (filterContext.Exception != null)
{
log.Error("Unhandled exception: " + filterContext.Exception.Message +
". Stack trace: " + filterContext.Exception.StackTrace,
filterContext.Exception);
}
}
Działa to świetnie, jeśli wystąpił nieobsługiwany wyjątek podczas akcji kontrolera.
Jeśli chodzi o błędy 404, mam niestandardowy błąd ustawiony w moim pliku web.config w następujący sposób:
<customErrors mode="On">
<error statusCode="404" redirect="~/page-not-found"/>
</customErrors>
W akcji kontrolera, która obsługuje adres URL „nie znaleziono strony”, rejestruję żądany pierwotny adres URL:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult PageNotFound()
{
log.Warn("404 page not found - " + Utils.SafeString(Request.QueryString["aspxerrorpath"]));
return View();
}
I to też działa.
Problem, który mam, polega na tym, jak rejestrować błędy na samych stronach .aspx. Załóżmy, że mam błąd kompilacji na jednej ze stron lub jakiś wbudowany kod, który zgłosi wyjątek:
<% ThisIsNotAValidFunction(); %>
<% throw new Exception("help!"); %>
Wygląda na to, że atrybut HandleError prawidłowo przekierowuje to na moją stronę Error.aspx w folderze udostępnionym, ale zdecydowanie nie jest przechwytywany przez metodę OnActionExecuted mojego BaseControllera. Myślałem, że mógłbym umieścić kod logowania na samej stronie Error.aspx, ale nie jestem pewien, jak pobrać informacje o błędzie na tym poziomie.
źródło
Odpowiedzi:
Rozważyłbym uproszczenie Twojej aplikacji internetowej poprzez podłączenie Elmaha .
Dodaj zestaw Elmah do projektu, a następnie skonfiguruj plik web.config. Następnie zarejestruje wyjątki utworzone na poziomie kontrolera lub strony. Można go skonfigurować tak, aby logował się do różnych miejsc (takich jak SQL Server, poczta e-mail itp.). Zapewnia również interfejs WWW, dzięki czemu można przeglądać dziennik wyjątków.
Jest to pierwsza rzecz, którą dodaję do każdej utworzonej przeze mnie aplikacji asp.net mvc.
Nadal używam log4net, ale zwykle używam go do logowania debugowania / informacji i zostawiam wszystkie wyjątki Elmah.
Więcej informacji można również znaleźć w pytaniu Jak rejestrować błędy (wyjątki) w aplikacjach ASP.NET? .
źródło
Możesz podłączyć się do zdarzenia OnError w pliku Global.asax.
Coś takiego:
źródło
Server
zawsze będzie różna od null.if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404) return;
MVC3
Create Attribute, który dziedziczy po HandleErrorInfoAttribute i obejmuje wybór logowania
Umieść atrybut w Global.asax RegisterGlobalFilters
źródło
Czy myślałeś o rozszerzeniu atrybutu HandleError? Również Scott ma dobrą blogu o przechwytujących filtracyjnych na kontrolerach / działań tutaj .
źródło
Widok Error.aspx jest zdefiniowany w następujący sposób:
HandleErrorInfo ma trzy właściwości: string ActionName string ControllerName Exception Exception
Powinieneś mieć dostęp do HandleErrorInfo, a tym samym do wyjątku w widoku.
źródło
Możesz spróbować zbadać HttpContext.Error, ale nie jestem tego pewien.
źródło