2015-02-07 15 views
15

Wie kann ich eine eigene Protokollierungslogik an eine ASP.NET 5-Anwendung anhängen, um jede Ausnahme zu behandeln, die in der Geschäftslogik und den unteren Ebenen ausgelöst wird?Globale Ausnahmebehandlung in ASP.NET 5

Ich versuchte mit eigenen ILoggerProvider Implementierung und loggerfactory.AddProvider(new LoggerProvider(Configuration)) in Startup.cs. Aber es scheint, dass es innere ASP.NET-Sachen abfängt und nicht meine geworfenen Ausnahmen in unteren Schichten.

+0

Suchen Sie nach völlig willkürlichen Ausnahmen? Oder Ausnahmen, die dazu führen, dass die Anforderung fehlschlägt? Wenn es versucht wird, * alle * Ausnahmen zu erfassen, ist das nicht realistisch möglich, da die meisten Ausnahmen von Teilen des Systems abgefangen und gehandhabt werden (und dann einem Logger zugeführt werden). Wenn Sie feststellen, dass einige Ausnahmen nicht protokolliert werden, melden Sie einen Fehler im entsprechenden Repository unter https://github.com/aspnet/ (z. B. MVC oder XRE). – Eilon

+0

Ja, das war der Grund, warum es nicht funktioniert hat, weil ich sie in den unteren Schichten gefangen habe, aber als ich den Fang vorübergehend kommentiert habe, erlaubte mir nur der Filteransatz, die geworfene Ausnahme zu erwischen ILogger, ist das normales Verhalten? Wenn nicht, kann ich es noch einmal versuchen (wie ich derzeit den Global Filter-Ansatz implementiert habe), und wenn das der Fall ist, kann ich darüber auf GitHub schreiben. –

+0

Ja, wenn Sie die Ausnahme fangen, wird niemand sonst es sehen, also gibt es nichts zu loggen. Aber Sie könnten sehr gut Recht haben, dass es eine andere Komponente gibt, wie Fehlerbehandlung Middleware, die die Ausnahme nicht protokolliert. Könnte für das https://github.com/aspnet/Diagnostics Repo geeignet sein. – Eilon

Antwort

10

Arbeitete es aus, die von zwei Optionen:

1) ILoggerProvider Implementieren Sie Ihre eigene ILoggerProvider und ILogger aus dem Namensraum Microsoft.Framework.Logging es dann in Startup.cs fügen folgenden Code in das MVC-Framework anhängen:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory) 
{ 
     loggerfactory.AddProvider(new YourCustomProvider()); 
} 

Aber die oben genannte Option scheint die Write-Funktion des ILogger auf MVC bestimmte Ereignisse nur zu nennen, Routing verwendet und so weiter, es wurde nicht genannt, als ich Ausnahmen auf meiner unteren Schicht geworfen, so dass die zweiten Option ausgearbeitet:

2) Globale Filter Ihre eigene Action Implementierung in Startup.cs registrieren:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc().Configure<MvcOptions>(options => 
    { 
     options.Filters.Add(new YourCustomFilter()); 
    }); 
} 

Es ist wichtig, dass die benutzerdefinierte Filter-Klasse implementiert die IExceptionFilter interace:

public class YourCustomFilter : ActionFilterAttribute, IExceptionFilter 
    { 
      public void OnException(ExceptionContext context) 
      { 
       ///logic... 
      } 
} 

(EDIT :) Und dann in der Startup-Klasse fügen wir den Filter hinzu:

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(options => 
      { 
       options.Filters.Add(new YourCustomFilter()); 
      }); 
    } 
+0

Kann der Inhalt der Antwort von der OnException-Methode aktualisiert werden? Ich bin in der Lage, den Statuscode zu aktualisieren, aber ich möchte auch den Antworttext aktualisieren, aber ich finde nicht, wie – RPDeshaies

+2

Ja, ist es möglich, indem Sie den ExceptionContext festlegen, der für die OnException-Methode bereitgestellt wird. Zum Beispiel context.Result = new RedirectResult ... oder context.Result = new JsonResult .... –

+1

@alekkowalczyk Hallo Ich folgte Ihrem Beispiel und die Syntax, die für mich im zweiten Schritt funktionierte, ist ein bisschen anders. Hier ist meine Version, kann vielleicht jemand anderen helfen, services.AddMvc ((Optionen => { options.Filters.Add (neue CustomFilerForExceptionHandling()); })); – Juan

2

Wenn Sie möchten ein wirklich globales Exception-Trap-Framework, nicht nur auf der Controller-Ebene, werfen Sie einen Blick auf eines meiner Open-Source-Projekte. Ich plane, es bald nach den Ferien in ein Nuget-Paket zu verwandeln. Ich plane auch, meinen Blog zu aktualisieren, der zeigt, warum ich ihn entwickelt habe.

Das Open-Source-Projekt ist auf github: https://github.com/aspnet-plus/AspNet.Plus.Infrastructure Werfen Sie einen Blick auf das Beispiel für die Verwendung.