2012-04-03 11 views
7

Sto utilizzando il framework di registrazione NLog e sto cercando di ottenere informazioni di eccezione e stacktrace in qualsiasi applicazione di logger UDP, come Sentinel e Log2Console, ma posso ottenere solo la parte di messaggio di registro visualizzato. L'output in un file funziona bene, dato che la maggior parte degli esempi fa proprio questo, quindi il problema ruota attorno all'utilizzo di target di rete con NLog.Come registrare eccezioni con destinazioni di rete in NLog

Bonus se un formato personalizzato può essere applicato su eccezioni interne e stacktrace, ma questo non è richiesto. Exception.ToString() farebbe molto.

Nota sul codice di esempio: Con Log2Console ho trovato un article su come inviare un'eccezione come voce di registro separata. Sebbene funzionasse, non ero soddisfatto della soluzione.

Esempio codice di registrazione eccezione:

Logger Log = LogManager.GetCurrentClassLogger(); 

try 
{ 
    throw new InvalidOperationException("My ex", new FileNotFoundException("My inner ex1", new AccessViolationException("Innermost ex"))); 
} 
catch (Exception e) 
{ 
    Log.ErrorException("TEST", e); 
} 

Esempio NLog.config:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<targets async="true"> 

    <!-- Send by UDP to Sentinel with NLogViewer protocol --> 
    <target name="network" xsi:type="NLogViewer" address="udp://192.168.1.3:9999" layout="${message}${onexception:inner=${newline}${exception:format=tostring}}" /> 

    <!-- Send message by UDP to Log2Console with Chainsaw protocol --> 
    <target name="network2" xsi:type="Chainsaw" address="udp://192.168.1.3:9998" appinfo="Grocelist"/> 

    <!-- Send exception/stacktrace by UDP to Log2Console with generic network protocol --> 
    <target name="network2ex" xsi:type="Network" address="udp4://192.168.1.3:9998" layout="${exception:format=ToString}" /> 

    <target name="logfile" xsi:type="File" layout="${longdate}|${level:uppercase=true}|${logger}|${message}|${exception:format=tostring}" 
       createDirs="true" 
       fileName="${basedir}/logs/${shortdate}.log" 
       /> 
</targets> 

    <rules> 
    <logger name="*" minlevel="Debug" writeTo="logfile" /> 
    <logger name="*" minlevel="Debug" writeTo="network" /> 
    <logger name="*" minlevel="Debug" writeTo="network2" /> 
    <logger name="*" minlevel="Warn" writeTo="network2ex" /> 
    </rules> 
</nlog> 

Alcuni link:

Modifica: Dopo aver cercato un po 'di più questo sembra essere un limite alla fine di NLog. Una recente patch è apparentemente là fuori: log4jxmlevent does not render Exception

Edit2: Ho ricostruito NLog con la patch, ma non sembrano aiutare nella Sentinel o Log2Console applicazioni. Potrei dover provare log4net per assicurarmi che quelle app supportino realmente quello che sto cercando di ottenere.

Edit3: Attualmente uso string.Format() di aderire e Formato messaggio e l'eccezione me stesso testo. Funziona bene, ma non è quello che sto cercando qui.

+0

Il codice sorgente per NLogViewerTarget su Github mostra che il set di layout {} non è operativo, quindi non è possibile sovrascrivere il valore predefinito che non include le eccezioni. –

risposta

1

Hai provato l'ultima fotografia sviluppatore di Chainsaw? Si mostrerà tracce di stack e supporta log4net/appenders UDP, e secondo NLog si può utilizzare così: http://nlog-project.org/wiki/Chainsaw_target

provare l'ultima snapshot sviluppatore, ha una tonnellata di caratteristiche: http://people.apache.org/~sdeboy

+0

mi sento male, ma io non riesco a capire come far funzionare l'ultima istantanea su Windows? Il file zip contiene solo un .bat e, leggendolo, non riesco a capire esattamente cosa devo fare per farlo funzionare. – angularsen

+0

È necessario disporre di un runtime Java installato. Una volta fatto, puoi salvare il file zip nel tuo file system ed estrarlo, andare alla cartella apache-chainsaw-2.1.0-SNAPSHOT \ bin ed eseguire il comando chainsaw.bat. Questo dovrebbe farlo. – Scott

1

Basta scaricare e costruire l'ultimo (NLog-Build-2.0.0.2007-0-g72f6495) fonti da GitHub: https://github.com/jkowalski/NLog/tree/ Questo problema è stato risolto dallo sviluppatore di NLog.

+0

È anche possibile scaricare i binari compilati da qui http://nlog.codeplex.com/releases/view/81084 – gschuager

3

È anche possibile estendere NLog per includere eccezioni per la registrazione di rete.

Crea un layout esteso:

[Layout("Log4JXmlEventLayoutEx")]  
public class Log4JXmlEventLayoutEx : Log4JXmlEventLayout 
{ 
    protected override string GetFormattedMessage(LogEventInfo logEvent) 
    { 
     string msg = logEvent.Message + " ${exception:format=Message,Type,ToString,StackTrace}"; 
     msg = SimpleLayout.Evaluate(msg, logEvent);  
     LogEventInfo updatedInfo; 
     if (msg == logEvent.Message) { 
      updatedInfo = logEvent; 
     } else { 
      updatedInfo = new LogEventInfo(
       logEvent.Level, logEvent.LoggerName, 
       logEvent.FormatProvider, msg, 
       logEvent.Parameters, logEvent.Exception); 
     }  
     return base.GetFormattedMessage(updatedInfo); 
    } 
} 

Creare un target che utilizza il layout

[Target("NLogViewerEx")] 
public class NLogViewerTargetEx : NLogViewerTarget 
{ 
    private readonly Log4JXmlEventLayoutEx layout = new Log4JXmlEventLayoutEx();  
    public override Layout Layout { get { return layout; } set {} } 
} 

Aggiornamento NLog.config:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <extensions> 
    <add assembly="Assembly.Name.That.Contains.Extended.Target"/> 
    </extensions> 
    <targets> 
    <target name="logViewer" 
      xsi:type="NLogViewerEx" 
      address="udp://localhost:7071"> 
    </targets> 
... 
</nlog> 
+0

Grazie per questa bella soluzione! –

+0

Ciao Alex, è possibile avere due layout personalizzati per due target? 'Sentinel' e' File? Sono bloccato e non funziona (https://stackoverflow.com/q/47753773/6229375) - (collegamento aggiornato). –

1

Nella tua NLog.config modificare il bersaglio come il seguente

<target name="file" xsi:type="File" fileName="log.txt" layout="${longdate}:${message} ${exception:format=message,stacktrace:separator=*}" /> 

La parte che si sta cercando è

${exception:format=message,stacktrace:separator=*} 

Per ulteriori informazioni su questo aspetto here.

+0

Questo è solo per il file target, giusto? La domanda era di ottenere informazioni sulle eccezioni per gli obiettivi di rete. – angularsen

+0

Ah, devo averlo perso. Sì, questo è per l'output in un file. GL ottenendo una soluzione di rete. – JabberwockyDecompiler

2

ho avuto questo problema, e ha appena aggiornato il mio pacchetto NuGet NLog a 2.0.1.2

Ora devo eccezioni che passa per Log2Console bene.

+0

Grazie per il testa a testa, dovrò rivedere questo qualche volta e provare io stesso! Potresti anche postare la tua configurazione? – angularsen

2

Alcuni anni più tardi e questo è abbastanza banale, prova ad aggiungere

includeSourceInfo = "true"

al vostro file di destinazione, in modo da assomiglia;

<target name="viewer" 
      xsi:type="NLogViewer" 
      includeSourceInfo="true" 
      address="udp://127.0.0.1:9999" /> 

Fornisce informazioni sul file di origine, sulla linea, sulla classe e sul metodo.

+0

Grazie, ci proverò la prossima volta che incontrerò di nuovo NLog e UDP. – angularsen

+0

Purtroppo non è ancora facile ottenere uno stacktrace! E correre in modalità Release toglie molte informazioni sulla fonte .. Eviterei questo approccio un po 'più a lungo :-) – keithl8041

Problemi correlati