2009-09-02 9 views
25

Czy możesz wskazać mi samouczek lub przykłady, w jaki sposób mogę rejestrować wszystkie nieobsługiwane wyjątki , które występują w mojej aplikacji internetowej mvc przy użyciu log4net. Dziękujemylog4net rejestrowanie wszystkich nieobsługiwanych błędów aplikacji

+3

Może lub nie może znaleźć to ciekawe (nie jestem pewien, czy to będzie działać z log4net): ELMAH - http://code.google.com/p/elmah/ –

+0

Dzięki! W rzeczywistości pracowałem nad tym problemem, a także podoba mi się wygodny interfejs, który ma. Na razie widzę, jak ja używam go w porównaniu do sieci log4, ale zobaczę, jak to będzie wyglądało z większym doświadczeniem .. – kaivalya

Odpowiedz

49

wkleić poniższy kod używam na moim global.asax, który wydaje się zaspokoić mnie teraz .. Dostaję wszystkie nieobsłużonych wyjątków na mój log4net generowane pliki dziennika ..

public class MvcApplication : System.Web.HttpApplication 
    { 

     private static readonly ILog log = LogManager.GetLogger(typeof(MvcApplication)); 

     void Application_Error(Object sender, EventArgs e) 
     { 
      Exception ex = Server.GetLastError().GetBaseException(); 

      log.Error("App_Error", ex); 
     } 


     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       "Default", 
       "{controller}/{action}/{id}", 
       new { controller = "Home", action = "Index", id = "" } 
      ); 

     } 

     protected void Application_Start() 
     { 
      RegisterRoutes(RouteTable.Routes); 
      log4net.Config.XmlConfigurator.Configure(); 

     } 

    } 
+2

Możesz również użyć modułu HttpModule do zarejestrowania Program obsługi zdarzeń błędu: http://codebetter.com/blogs/karlseguin/archive/2006/06/12/146356.aspx – dahlbyk

+1

Będziesz chciał dodać 'routes.IgnoreRoute (" {* favicon} ", nowy {favicon = @ "(. * /)? favicon.ico (/.*)?"}); "do metody RegisterRoutes, jeśli nie masz favikonu znajdującego się w Twojej witrynie – Tr1stan

+0

O HttpModule: metoda rejestracji modułu w połączonym artykule dotyczy starego trybu potoku klasycznego IIS, a nie trybu (teraz zalecanego) zintegrowanego. Zobacz https://msdn.microsoft.com/library/ms227673(v=vs.100).aspx, aby uzyskać szczegółowe informacje na temat rejestracji, jeśli używasz trybu zintegrowanego. – personne3000

2

Bez bycia żartownym here you go.

 try 
     { 
      NotImplementedException nie = new NotImplementedException(); 
      throw nie; 
     } 
     catch (Exception e) 
     { 
      Log.Fatal(e); 
     } 

Zakładając, że używasz .NET 3.5, można użyć metody rozszerzenie i przedłużyć System.Exception i dodać (log log4net.ILog) metody Log, wtedy gdziekolwiek złapać wyjątek w aplikacji, przy założeniu, że poprawnie skonfigurujesz instancję dziennika, a następnie łatwo to zrobisz. Twoja klasa rozszerzeń może się bardzo rozwinąć, z różnymi przeciążeniami dla debugowania, informacji, ostrzeżenia, błędów i zdarzeń krytycznych.

+0

Niestety moje pytanie nie było jasne - muszę zalogować wszystkie nieobsłużone wyjątki – kaivalya

2

Być może zainteresuje Cię to, co to jest Aspect Oriented Programming (AOP).

Osiągnęliśmy to dzięki Post sharp (tylko - nie używaliśmy log4net, ale niestandardowego znacznika).

Po prostu sprawdź najpierw, czy log4net nie ma czegoś do tego "out-of-the-box". Nie jestem co do tego pewien.

2

Nie ma wbudowanej obsługi tego w log4net. Powinieneś zaimplementować the Application_Error event w Global.asax i zadzwonić do swojego log4net logger. Zdarzenie zostanie uruchomione dla wszystkich nieobsługiwanych zdarzeń w Twojej aplikacji.

5

dla ASP.NET aplikacje, które lubisz używać zdarzenia System.Web.HttpApplication.Error, które znajduje się w pliku Global.asax.

protected void Application_Error(Object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 

    // Stop error from displaying on the client browser 
    Context.ClearError(); 

    logger.Fatal(ex.ToString); 

} 

oglądać Managing unhandled exceptions