2010-06-07 9 views
13

Ich möchte in jedem catch-Block anmelden können. Etwas wie das.Wie protokolliere ich eine Ausnahme in einer Datei?

und dann die Einstellungen in der Konfiguration übernehmen die Message und StackTrace-Eigenschaft usw. mit Kunden Listener.

Ich möchte Enterprise Library Logging Application Block verwenden. Ich bin sicher, dass jemand das schon getan haben muss.

Antwort

31

Andere haben einige gute Links auf den Logging Application Block (LAB) veröffentlicht, damit ich das hier nicht vervielfältige.

In Bezug auf die Ausnahme Formatierung Sie haben drei Möglichkeiten, die ich denken kann:

  1. die Standard Exception.ToString() Implementierung verwenden (es ist nicht schlecht)
  2. eine benutzerdefinierte Formatter schreiben, die in den LAB integriert.
  3. Schreiben Sie eine Hilfsfunktion, die die Formatierung durchführt, und übergibt die Zeichenfolge an die Write-Methode.

Wenn Option 1 Ihre Anforderungen nicht erfüllt, dann würde ich die Option 3 empfehlen (da Option 2 übertrieben ist).

Ein einfaches Beispiel wäre so etwas wie:

catch (Exception exception) 
    { 
     Logger.Write(LogHelper.CreateExceptionString(exception)); 
    } 

    ... 

    public static string CreateExceptionString(Exception e) 
    { 
     StringBuilder sb = new StringBuilder(); 
     CreateExceptionString(sb, e, String.Empty); 

     return sb.ToString(); 
    } 

    private static void CreateExceptionString(StringBuilder sb, Exception e, string indent) 
    { 
     if (indent == null) 
     { 
      indent = String.Empty; 
     } 
     else if (indent.Length > 0) 
     { 
      sb.AppendFormat("{0}Inner ", indent); 
     } 

     sb.AppendFormat("Exception Found:\n{0}Type: {1}", indent, e.GetType().FullName); 
     sb.AppendFormat("\n{0}Message: {1}", indent, e.Message); 
     sb.AppendFormat("\n{0}Source: {1}", indent, e.Source); 
     sb.AppendFormat("\n{0}Stacktrace: {1}", indent, e.StackTrace); 

     if (e.InnerException != null) 
     { 
      sb.Append("\n"); 
      CreateExceptionString(sb, e.InnerException, indent + " "); 
     } 
    } 
+0

Es ist auch hilfreich, den Namen des Ausnahmetyps anzugeben. Aber ansonsten ganz nett. –

+1

@Andrew: Ja, oder Sie könnten Code hinzufügen, um das IDictionary aus der Data-Eigenschaft zu extrahieren. –

+0

[Hier] (http://www.aspsnippets.com/Articles/Create-simple-Error-Log-Text-File-in-ASPNet-using-C-and-VBNet.aspx) ist eine andere ** Lösung ** . Hoffnung hilft. – stom

0

Sie müssen einen geeigneten Listener für Textdateien hinzufügen - siehe this Post, es ist für ASP.NET aber die Konfigurationsdateien funktionieren auf die gleiche Weise über Anwendungen.

+0

Kann ich etwas tun, direkt Objekt Ausnahme passieren, so dass es detaillierte Trace-Stack gibt usw., die beim Debuggen hilfreich sein werden. – IsmailS

4

Microsoft hat umfangreiche Leitlinien für das hier zu finden: Developing Applications Using the Logging Application Block

Es lohnt sich, sich mit vertraut gemacht, was sie zu sagen haben, da es sehr mächtig ist.

Wenn Sie etwas ein wenig mehr auf der Erde wollen, sind einige Arbeitsbeispiele in diesem Blog-Artikel zur Verfügung gestellt: How To Configure and Use the Logging Application Block

Wenn Sie immer noch Schwierigkeiten haben nach denen zu lesen, bearbeiten Sie Ihre Post mit mehr spezifischen Details über das, was scheint das Problem zu sein.

+0

Kann ich etwas tun, um Exception-Objekt direkt zu übergeben, so dass es detaillierte Stack-Trace etc. gibt, die beim Debuggen hilfreich sein wird? – IsmailS

+0

Sie könnten eine ziemlich einfache Methode und/oder string.format Vorlage erstellen und sie dann verwenden, wenn Sie Logger.Write aufrufen. –

+0

Der Link configure geht direkt zur Werbung. – sweetfa

1

@iSid Ist das, was Sie fordern für

public static void printException(Exception ex){ 
       Console.WriteLine("HelpLink = {0}", ex.HelpLink); 
       Console.WriteLine("Message = {0}", ex.Message); 
       Console.WriteLine("Source = {0}", ex.Source); 
       Console.WriteLine("StackTrace = {0}", ex.StackTrace); 
       Console.WriteLine("TargetSite = {0}", ex.TargetSite); 

      } 
Verwandte Themen