2013-12-22 11 views
6

Gibt es in Log4Net oder NLog (oder einem anderen Logger) eine Möglichkeit, Protokolle in einem Ausführungsstapel-verschachtelten XML- oder JSON-Format auszugeben, sodass die Funktion A(), die aufruft, C("something") ausgibt und so etwas wie folgt ausgibt:Gibt es eine Möglichkeit in Log4Net oder NLog (oder einem anderen Logger), Protokolle in einem Ausführungsstapel-verschachtelten XML- oder JSON-Format auszugeben?

<Method name="A"> 
    <Method name="B" params="(int) 7"> 
     <Method name="C" params="(string) 'something'"/> 
    </Method> 
</Method> 

oder noch besser:

<Method name="A"> 
    <Method name="B" params="(int) 7"> 
     <Params> 
      <int>7</int> 
     </Params> 
     <Method name="C"> 
      <Params> 
       <string>something</string> 
      </Params> 
     </Method> 
    </Method> 
</Method> 

Warum? also wäre ich in der Lage (zB) XML Notepad oder irgendeinen JSON -viewer (kenne keinen bemerkenswerten ...) schnell (irrelevant) zu falten oder (relevante) Unterrufe aufzudecken, wenn ich versuche zu verstehen, was passiert ist falsch. Ich benutze PostSharp jede Methode Entry/Exit und Ausnahmen (zur Zeit als bloße Vertiefung) einzuloggen

+1

möglich Duplikat [Log4net XML-Ausgabe] (http://stackoverflow.com/questions/1147103/log4net-xml-output) – sweetfa

+1

kein Duplikat - die verknüpfte Frage diskutiert nicht über eine verschachtelte Ausgabe Erstellen – AlexD

Antwort

2

Die Logging-Framework nicht über Informationen über Ihre Methode Grenzen, und so kann es nicht das XML entsprechend formatiert werden. Sie können versuchen, das Framework zu erweitern und die zusätzlichen Informationen in die Protokollierungsmethoden zu übertragen.

Die einfachste Möglichkeit, diese Ausgabe zu erhalten, besteht darin, die gesamte Nachrichtenformatierung in Ihrer Aspektklasse durchzuführen und das Protokollierungsframework so zu konfigurieren, dass nur der Nachrichtentext ohne weitere Informationen ausgegeben wird.

Zum Beispiel in log4net Konfiguration:

<layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%message%newline" /> 
</layout> 

In Ihrem OnEntry Methode des Aspekts den XML-Tag (oder JSON-Objekt), und in den OnExit Verfahren schließt den Tag öffnen würde. Sie können mit dem folgenden einfachen Beispiel beginnen und den Code für Ihren speziellen Fall optimieren (z. B. Initialisieren der Loggerinstanz und Formatieren von Zeichenfolgen in RuntimeInitialize, Methoden CompileTimeInitialize).

[Serializable] 
public class XmlLogAttribute : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     ILog log = LogManager.GetLogger(args.Method.DeclaringType); 
     if (log.IsDebugEnabled) 
     { 
      log.DebugFormat("<Method name=\"{0}\">", args.Method.Name); 
      log.Debug("<Params>"); 
      foreach (object methodArgument in args.Arguments) 
      { 
       if (methodArgument == null) 
       { 
        log.Debug("<null/>"); 
       } 
       else 
       { 
        log.DebugFormat("<{0}>{1}</{0}>", methodArgument.GetType(), methodArgument); 
       } 
      } 
      log.Debug("</Params>"); 
     } 
    } 

    public override void OnExit(MethodExecutionArgs args) 
    { 
     ILog log = LogManager.GetLogger(args.Method.DeclaringType); 
     log.Debug("</Method>"); 
    } 
} 
+0

Im Grunde ist es das, was Tue ich heute, aber ohne XML (einfacher Einzug) und ohne Logging Framework. Also warum sollte ich 'log4net' in diesem Szenario brauchen? Welchen Mehrwert würde es mir geben? – Tar

+0

Nun, ein Vorteil, den ich im Logging-Framework sehe, ist seine Konfigurierbarkeit. Alle Komponenten Ihres Projekts senden die Nachrichten einfach an das Framework und kümmern sich nicht um den Rest. Während die Konfiguration verschiedene Ausgabeziele, Protokollebenen usw. spezifizieren kann, und dies kann leicht entsprechend der aktuellen Umgebung geändert werden. – AlexD

+0

OK, also ist Ihre Antwort praktisch "Nein, es ist nicht möglich (AFAIK!)" ... – Tar

0

Siehe stacktrace von log4net PatternLayout. Es ist offensichtlich teuer zu ernten, sollte aber einige Ergebnisse liefern. Es ist auch möglich, das Rendering der Protokollinformationen zu ändern. Im Projekt log4net.Ext.Json gibt es eine decorator, die zu diesem Zweck verwendet werden könnte. (Ich bin der Autor).