2012-12-15 19 views
11

Gibt es eine Möglichkeit, NLog so zu konfigurieren, dass alle von meiner Anwendung gesendeten Ausnahmen automatisch protokolliert werden? Zur Zeit gehe ich zu allen TRY/CATCH-Blöcken und füge manuell die Protokollierung in den CATCH ein - aber was, wenn ich etwas vermisse? Und was, wenn in der Zukunft jemand anderes tutNLog konfiguriert, um alle Ausnahmen automatisch zu protokollieren?

Gibt es eine Möglichkeit, NLog zu sagen, nur alle Ausnahmen zu protokollieren? Besonders einige, die nicht gefangen werden und könnte ein Popup verursachen?

Antwort

15

Soweit ich weiß, gibt es keine Möglichkeit, alle Ausnahmen zu protokollieren.

Wenn Sie nur unbehandelte Ausnahmen protokollieren möchten, können Sie bei der Initialisierung Ihrer Anwendung einen "UnhandledException Handler" zur AppDomain hinzufügen. Beachten Sie, dass es unter Umständen nicht möglich ist, den Fehler zu protokollieren (z. B. im Falle einer OutOfMemory-Ausnahme oder etwas Schrecklichem).

Beachten Sie, dass die AppDomain hat auch eine FirstChanceException Ereignis Sie abonnieren können, aber das würde bedeuten, dass Sie jede Ausnahme benachrichtigt, die auftritt (und kann durch den Benutzercode behandelt werden) - in dieser sind viele.

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException); 

static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    // use logger here to log the events exception object 
    // before the application quits 
} 

Beachten Sie, dass dies nur Ausnahmen zulassen protokollieren, die Ihre Anwendung zum Absturz bringen - Sie können es nicht verhindern kann zum Absturz bringen (daher der Name: nicht behandelte Ausnahme).

Eine andere Möglichkeit wäre, Aspektorientierte Programmierung (AOP) zu verwenden - und im Falle eines Fehlers nach jedem Methodenaufruf einen Protokollierungsaspekt einzuführen. Wenn Ihre Anwendung eine Layered-Architektur verwendet, kann dies relativ einfach sein (z. B. Hinzufügen eines Aspekts zu allen Aufrufen Ihrer Business-Logik-Ebene ...).

Sie können ein Framework wie PostSharp oder Spring.Net nützlich finden (normalerweise bieten ihre Websites einige einfache Beispiele dafür).

+0

Was den Anwendungsbereich dieser AppDomain ist? Werden alle unbehandelten Ausnahmen in meinem Projekt oder nur pro Klasse abgefangen? Auch ich referenziere einige DLLs, was ist mit Ausnahme von diesen? Muss ich diesen Code jeder DLL hinzufügen (welche sind ihre eigenen Projekte)? – JSchwartz

+1

Eine App-Domäne ist ein .NET-Konzept zum Definieren einer isolierten Grenze für eine Anwendung. Wenn Sie eine Konsolenanwendung erstellen, wird diese innerhalb einer Anwendungsdomäne ausgeführt. Alle erforderlichen Assemblys werden ebenfalls in derselben AppDomain geladen. Wenn in Ihrer Anwendung etwas passiert (egal in welcher Assembly), wird es in derselben Appdomain vorkommen. Normalerweise fügen Sie den Beispielcode nur einmal am Anfang Ihrer Anwendung ein (z. B. in der Methode "Main" Ihrer App oder bei einer WebApp in der Methode "global.asax" in der Methode "application_start"). siehe http://msdn.microsoft.com/en-us/library/system.appdomain.aspx –

0

Für WebAPI Anwendung, die Sie dies in Global.asax.cs wie das tun können

protected void Application_Error() 
{ 
    Exception lastException = Server.GetLastError(); 
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); 
    logger.Fatal(lastException); 
} 

MSDN resource

Verwandte Themen