2015-02-22 7 views
8

im obecnie jest w trakcie tworzenia aplikacji webapi2, a także w etapach przeprowadzania moich dzienników za pomocą NLog.konfigurowanie układu NLog tak, aby wyświetlał wszystkie wpisy kontekstu zdarzeń

w mojej aplikacji i zalogować się w sposób klucz-wartość przy użyciu słownika LogEventInfo.Properties w ten sposób:

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); 

wszystko działa poprawnie, ale nie mogę wydawać się znaleźć sposób, aby uczynić go tak układ drukuje wszystkie pozycje klucz-wartość znajdujące się w słowniku LogEventInfo.Properties.

pozwala założyć, że mój cel jest plikiem, a następnie muszę jednoznacznie wymienić nazwę klucza, czy istnieje sposób renderowania go w celu wyświetlenia całej zawartości słownika? to jak to zrobić dzisiaj, gdzie mogę się zalogować tylko wpisy znam:

<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}" /> 

Odpowiedz

2

Istnieje wbudowany mechanizm renderowania układu w języku NLog, który służy do tego celu - $ {all-event-properties}. Domyślnie emituje wszystkie właściwości kontekstu zdarzeń w stylu klucz-wartość, rozdzielane przecinkami.

Checkout docs więcej szczegółów https://github.com/NLog/NLog/wiki/All-Event-Properties-Layout-Renderer

+1

Spowoduje to wydrukowanie właściwości w formacie '[key] = [value]' zamiast tylko właściwości drukowania. – vendettamit

+0

Format można dostosować, używając "[wartość]", ponieważ format będzie drukować tylko wartości właściwości – pkmiec

+1

Nie! Zakładałem to samo, ale jeśli patrzysz na setter właściwości Format, to sprawdza on zarówno [klucz], jak i [wartość], więc rzuci wyjątek, jeśli brakuje jednego z nich. zobacz https://github.com/NLog/NLog/blob/master/src/NLog/LayoutRenderers/AllEventPropertiesLayoutRenderer.cs – vendettamit

4

Nie ma wbudowane wsparcie, które może uczynić wszystkie właściwości naraz. Jeśli spojrzysz na kod w event-context layout renderer, dodaje on tylko jedną wartość właściwości w oparciu o element, np. Nazwę właściwości.

Możesz utworzyć swój własny renderer układu, który będzie mógł drukować wszystkie właściwości z LogEventInfo. Zamiast pobierać wartość nieruchomości w oparciu o element, po prostu dodaj wszystkie do konstruktora ciągów, który zostanie wydrukowany w celu.

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)); 
      } 

     } 
    } 
} 

można zarejestrować ten mechanizm renderujący niestandardowy układ używając <extension> tag w pliku konfiguracyjnego 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> 

ten powinien wydrukować wszystkie właściwości values only bez konieczności nazwę elementu.

+0

+1 dla kodu i konfiguracji. Ale w oparciu o odpowiedź @ pkmiec, możesz nadal wspierać stwierdzenie "Nie ma wbudowanej obsługi, która może renderować wszystkie właściwości naraz". dla NLog 4.0? Wygląda na to, że $ {all-event-properties} robi to w 4.0+ – slolife

+0

Zobacz moje uwagi na temat innej odpowiedzi, która może być argumentem wspierającym. – vendettamit

+0

Odniosłem się do kodu źródłowego Nlog hostowanego na github i powinno to być aktualne. – vendettamit

Powiązane problemy