2014-11-11 14 views
5

Penso di perdere qualcosa perché non riesco a capire come farlo scrivere in un file di registro in formato json utilizzando l'installazione di NLog nel file di configurazione. Il file retto funziona bene, ma non il json. L'obiettivo JSON emette solo il messaggio (non in json).utilizzando Nlog e scrivendo nel file come jias

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">   
    <targets async="true"> 
     <target xsi:type="File" name="rollingFile" fileName="${basedir}/logs/${shortdate}.log" archiveFileName="${basedir}/logs/{shortdate}_Archive{###}.log" archiveAboveSize="1000000" archiveNumbering="Sequence" layout="${longdate} ${uppercase:${level}} ${callsite} ${message}" /> 
     <target xsi:type="File" 
       name="rollingFileJson" 
       fileName="${basedir}/logs/${shortdate}.json" 
       archiveFileName="${basedir}/logs/{shortdate}_Archive{###}.json" 
       archiveAboveSize="1000000" 
       archiveNumbering="Sequence" 
       layout="${json-encode} ${message}"> 
     </target> 

    </targets> 
    <rules> 
     <logger name="*" minlevel="Trace" writeTo="rollingFile" /> 
     <logger name="*" minlevel="Trace" writeTo="rollingFileJson" /> 
    </rules> 
    </nlog> 

risposta

2

Secondo NLog documentation: json-encode sarà solo uscita fuga di un altro formato utilizzando le regole JSON. Non "convertirà" l'output in JSON. Dovrai farlo tu stesso.

'{ "date":"${longdate}","level":"${level}","message":${message}}' 

Date un'occhiata a this question per maggiori dettagli.

7

A partire dal rilascio di NLog 4.0.0 è possibile utilizzare un layout che esegue il rendering degli eventi come documenti JSON strutturati.

esempio tratto da NLog project site:

<target name="jsonFile" xsi:type="File" fileName="${logFileNamePrefix}.json"> 
    <layout xsi:type="JsonLayout"> 
     <attribute name="time" layout="${longdate}" /> 
     <attribute name="level" layout="${level:upperCase=true}"/> 
     <attribute name="message" layout="${message}" /> 
    </layout> 
</target> 

Edit: è anche possibile creare nel codice.

Here è il collegamento alla parte specifica della documentazione.

Ed ecco l'esempio copiato:

var jsonLayout = new JsonLayout 
{ 
    Attributes = 
    { 
     new JsonAttribute("type", "${exception:format=Type}"), 
     new JsonAttribute("message", "${exception:format=Message}"), 
     new JsonAttribute("innerException", new JsonLayout 
     { 

      Attributes = 
      { 
       new JsonAttribute("type", "${exception:format=:innerFormat=Type:MaxInnerExceptionLevel=1:InnerExceptionSeparator=}"), 
       new JsonAttribute("message", "${exception:format=:innerFormat=Message:MaxInnerExceptionLevel=1:InnerExceptionSeparator=}"), 
      } 
     }, 
     //don't escape layout 
     false) 
    } 
}; 

Per maggiori informazioni leggere il docs.

+0

Qualsiasi modo di farlo in modo programmatico? – user3841581

+0

@ user3841581 Aggiunto un esempio tratto dalla documentazione per farlo nel codice. – Chrono

Problemi correlati