2015-02-22 14 views
8

im attualmente in fase di sviluppo di un'applicazione webapi2 e nelle fasi di esecuzione dei miei registri tramite NLog.configurazione del layout di NLog per mostrare tutte le voci di contesto evento

nella mia applicazione i log in un modo di valori-chiave utilizzando il dizionario LogEventInfo.Properties in questo modo:

thisController.LogParams.Add("ControllerName",controllerName); 
thisController.LogParams.Add("ActionName", actionName); 
thisController.LogParams.Add("TotalTime", actionWatch.ElapsedMilliseconds); 
LogEventInfo logEvent = new LogEventInfo() 
     { 
      Message = string.IsNullOrEmpty(thisController.LogMessage)? "Finished Successfuly":thisController.LogMessage, 
      Level = LogLevel.Info, 
      TimeStamp = DateTime.Now 
     }; 
logEvent.Properties.Merge(thisController.LogParams); 
logger.Log(logEvent); 

tutto funziona bene, ma i cant sembrano trovare il modo di rendere il layout in modo che stampa tutte le voci chiave-valore presenti nel dizionario LogEventInfo.Properties.

consente di presupporre che il mio obiettivo è un file, quindi devo menzionare esplicitamente il nome della chiave, c'è un modo per renderlo in grado di mostrare tutto il contenuto del dizionario? questo è come lo faccio oggi, dove posso accedere solo le voci che conosco di:

<target name="f1" 
    xsi:type="File" 
    fileName="${basedir}\logs\log.txt" 
    maxArchiveFiles="60" 
    archiveNumbering="Date" 
    archiveDateFormat="yyyyMMdd" 
    archiveEvery="Day" 
    layout="${longdate} : ${callsite:className=true:methodName=true} : ${event-context:item=ControllerName} : ${event-context:item=ActionName} : ${event-context:item=TotalTime} : ${message}" /> 

risposta

2

C'è un renderizzatore di layout incorporato in NLog che serve a tale scopo - $ {proprietà di tutti gli eventi}. Per impostazione predefinita, emette tutte le proprietà del contesto dell'evento nello stile valore-chiave, separate da virgola.

Cassa la documentazione per maggiori dettagli https://github.com/NLog/NLog/wiki/All-Event-Properties-Layout-Renderer

+1

Questo stamperà le proprietà nel formato '[chiave] = [valore]' invece delle sole proprietà di stampa. – vendettamit

+0

Il formato è personalizzabile, utilizzando "[valore]" poiché il formato stamperà solo i valori delle proprietà – pkmiec

+1

No! Stavo assumendo lo stesso, ma se si guarda il setter della proprietà Format ha il controllo sia di [chiave] e [valore] in modo che getti eccezione di uno di loro manca. vedere https://github.com/NLog/NLog/blob/master/src/NLog/LayoutRenderers/AllEventPropertiesLayoutRenderer.cs – vendettamit

4

Non c'è alcun supporto incorporato che può rendere tutte le proprietà in una sola volta. Se si guarda il codice in event-context layout renderer, viene aggiunto solo un singolo valore della proprietà in base all'elemento il nome della proprietà i.e.

È possibile creare il renderizzatore di layout personalizzato in grado di stampare tutte le proprietà da LogEventInfo. Invece di recuperare il valore della proprietà in base all'elemento, aggiungili tutti al generatore di stringhe che verrà stampato come target.

using System; 
using System.Globalization; 
using System.Text; 
using NLog.Config; 
namespace CustomLayoutRenderer 
{ 
    /// <summary> 
    /// Log event context data. 
    /// </summary> 
    [LayoutRenderer("event-context-all")] 
    public class EventContextLayoutRenderer : LayoutRenderer 
    { 
     /// <summary> 
     /// Renders the specified log event context item and appends it to the specified <see cref="StringBuilder" />. 
     /// </summary> 
     /// <param name="builder">The <see cref="StringBuilder"/> to append the rendered data to.</param> 
     /// <param name="logEvent">Logging event.</param> 
     protected override void Append(StringBuilder builder, LogEventInfo logEvent) 
     { 
      foreach (var item in logEvent.Properties) 
      { 
       // item is a keyvalue pair object you can custom format the key value as needed. 
       builder.Append(Convert.ToString(item.Value, CultureInfo.InvariantCulture)); 
      } 

     } 
    } 
} 

È possibile registrare questo renderer layout personalizzato utilizzando <extension> tag nel file di configurazione NLog.

<nlog> 
    <extensions> 
    <!-- Add the assembly name which contains the custom layout renderer --> 
    <add assembly="MyAssembly"/> 
    </extensions> 
    <targets> 
    <target name="f1" type="file" layout="${longdate} ${event-context-all}" 
      fileName="${basedir}/logs/logfile.log" /> 
    </targets> 
</nlog> 

Ciò deve stampare le tutte le proprietà values only senza richiedere il nome della voce.

+0

+1 per il codice e configurazione. Ma basandomi sulla risposta di @ pkmiec, puoi ancora supportare l'affermazione "Non esiste un supporto integrato che possa eseguire il rendering di tutte le proprietà contemporaneamente". per NLog 4.0? Sembra che $ {all-event-properties} faccia questo in 4.0+ – slolife

+0

Vedere i miei commenti su altre risposte spero che possa essere un argomento di supporto. – vendettamit

+0

Ho fatto riferimento al codice sorgente Nlog ospitato su github e dovrebbe essere aggiornato. – vendettamit

Problemi correlati