2014-05-13 3 views
9

Ich bin neu bei Serilog und es fällt mir schwer herauszufinden, wie die Kontextfunktionalität verwendet wird. Wenn ich den folgenden Code ausführe, enthält die Ausgabedatei nicht die Berichts-ID. Irgendwelche Ideen was ich vermisse?Verwendung von Serilog ForContext

var logger = new LoggerConfiguration() 
       .WriteTo 
       .File(@"C:\Log.txt") 
       .CreateLogger() 
       .ForContext("Report ID", 10); 

logger.Information("Test"); 

Antwort

12

Nicht alle Eigenschaften, die an ein Protokollereignis angehängt sind, werden von allen Senken gerendert, die an den Protokollierer angehängt sind. Die hier verwendete Dateisenke enthält nur Zeitstempel, Level, Nachricht und so weiter.

Um die Report-ID in die Datei zu erhalten, ist es in der Senke der outputTemplate:

var logger = new LoggerConfiguration() 
    .WriteTo.File(@"C:\Log.txt", 
    outputTemplate: "{Timestamp:u} [{Level}] ({ReportId}) {Message}{NewLine}{Exception}") 
    .CreateLogger() 
    .ForContext("ReportId", 10); 

logger.Information("Test"); 

Dies wird die Report-ID in jeder Nachricht enthalten.

ForContext wird normalerweise verwendet, um einen kurzen temporären Bereich zu erstellen; wenn Sie die gleiche Eigenschaft auf alle Nachrichten möchten, können Sie Enrich.WithProperty() verwenden:

var logger = new LoggerConfiguration() 
    .Enrich.WithProperty("ReportId", 10); 
    .WriteTo.File(@"C:\Log.txt", 
    outputTemplate: "{Timestamp:u} [{Level}] ({ReportId}) {Message}{NewLine}{Exception}") 
    .CreateLogger() 

Flat Files eine gute Möglichkeit, um aufzustehen und schnell mit strukturierten Protokolle ausgeführt wird, aber einen Datenspeicher besser geeignet für strukturierte Lagerung, z.B. CouchDB, RavenDB oder Seq, macht es viel schöner, Ereignisse basierend auf Eigenschaftswerten anzuzeigen und zu korrelieren.

+1

zum JSON Sink ändern (auch eine einfache Datei-Targeting) ermöglicht strukturierte Protokollierung (dh alle. Felder) und wird leicht in Splunk usw. aufgenommen. – user2864740

1

Log unten Code:

Log.ForContext("CategoryName", "CategoryValue").Information("My Info"); 

Dann können Sie sie mit folgenden Abfrage abfragen:

select EventType,@Properties.CategoryName AS CategoryName, @Message, @Properties 
from stream 
where CategoryName = 'CategoryValue' 
limit 1000 
+0

Woher kommt dieser 'Stream'? – MEMark

Verwandte Themen