2010-08-11 5 views
9

Derzeit haben wir NLog, die CSV-Dateien ausspuckt, nur um zu beweisen, dass NLog tatsächlich Protokollierungs-Ausnahmen hat.NLog konfigurieren, um Ausnahmen in einer XML-Ausgabe zu protokollieren?

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" internalLogToConsole="true" internalLogToConsoleError="true"> 
<targets> 
    <target name="file" xsi:type="File" fileName="${specialfolder:folder=ApplicationData}/log.csv"> 
    <layout xsi:type="CSVLayout"> 
     <column name="User_Machine_Name" layout="${machinename}" /> 
     <column name="Time" layout="${date}" /> 
     <column name="Level" layout="${level}" /> 
     <column name="Message" layout="${message}" /> 
     <column name="Exception_Message" layout="${exception:format=Message}"/> 
     <column name="Exception_Type" layout="${exception:format=Type}"/> 
     <column name="Callsite_Class" layout="${callsite:methodName=false}" /> 
     <column name="Callsite_Method" layout="${callsite:className=false}" /> 
     <column name="Stack_Trace" layout="${stacktrace:format=DetailedFlat}"/> 
    </layout> 
    </target> 
    <target name="console" xsi:type="Console" 
    layout="${longdate}|${level}|${message}"> 
    </target> 
</targets> 
<rules> 
    <logger name="*" minlevel="Trace" writeTo="file" /> 
</rules> 

Dies funktioniert mit Ausnahme wie erwartet, dass ich es zur Ausgabe in XML benötigen. Ich habe NLog-Dokumentation durchgesehen und das einzige, was ich gefunden habe, ist, dass es ein Log4JXmlEventLayout gibt, aber die Dokumentation geht nicht darauf ein, wie man es benutzt. Ich bin neu in NLog und ich kann nicht viele Ressourcen zu diesem Thema finden.

Antwort

9

Soweit ich sagen kann, hat der Log4JXmlEventLayout einige Eigenschaften zugeordnet (Stack Trace-ish Informationen, Aufruf von Klasse, Zeit, etc.), aber das ist es. Ich habe untersucht, wie ich zusätzliche Informationen hinzufügen kann, aber es scheint, als ob das nicht möglich ist.

Eine mögliche Konfiguration sieht wie folgt aus:

<target name ="xmlFile" xsi:type="File" 
       fileName="${tempdir}/${processname}/log.xml" 
       archiveFileName="${tempdir}/${processname}/archive/log_{#####}.xml" 
       archiveAboveSize="10000000" 
       layout="${log4jxmlevent:includeSourceInfo=true:includeCallSite=true:includeMDC=true:appInfo=true:includeNDC=true:includeNLogData=true}"/> 

aber ich habe festgestellt, dass nur NLog 2.0 tatsächlich Gebrauch von Attributen wie „includeSourceInfo“ machen. Es schien mir, dass in NLog 1.0, wenn diese auf "true" gesetzt waren, das resultierende XML nur das Datum, die Ebene und die Nachricht enthielt.

Ein Grund nicht Log4JXmlEventLayout zu verwenden, ist, dass es nicht mit Ausnahmen tut nichts, das heißt, wenn Sie

logger.ErrorException("This shouldn't happen", exception); 

der Logger „Das sollte nicht passieren“ wird aufschreiben nennen, aber die Info Ausnahme ist Weg.

Vielleicht wäre es möglich, einen benutzerdefinierten XML-Wrapper um die gewünschten Daten zu erstellen. Ich habe das noch nicht gemacht, aber ich denke darüber nach, aufgrund der Einschränkungen in Log4JXmlEventLayout.