2017-01-03 3 views
1

Ich möchte jede Json in Serilog Eigenschaften protokollieren. Ich habe viel über serilog und json gelesen, aber es ist eine strukturierte json-Protokollierung mit einer Nachrichtenvorlage. Anstatt also diesen Log.Info("{@text}",text); die Protokollierung würde Ich mag, dies zu tun:Log Json mit Serilog

var json="{ \"text\": \"hello\" }"; //a json string or a Json object 
Log.Info(json); 

Der wesentliche Unterschied besteht darin, dass mit dem ersten Ansatz, können Sie eine Nachrichtenvorlage haben und immer haben Sie eine „Text“ Eigenschaft. Ich möchte json mit unterschiedlichen Strukturen haben, wenn beispielsweise dann ich habe:

var json="{ \"text\": \"hello\", \"text2\": \"hello2\" }"; //a json string or a Json object 
Log.Info(json); 

I 2 Eigenschaften erhalten möchte, das heißt, 1-Eigenschaft für jede json Eigenschaft, ohne eine Nachrichtenvorlage definieren zu müssen. Ist das möglich? muss ich meinen eigenen JsonFormatter implementieren?

+1

Es sollte, dass JSON beachtet werden [Definition] (http://www.json.org/) ist eine Zeichenfolge, basierend Austausch-Format. Es gibt kein Konzept von JSON als String gegen ein Objekt ... – War10ck

+0

danke für deine Antwort. Ich habe ein logarithmisches Repository und möchte nach der Eigenschaft suchen, also würde ich mit einer Nachrichtenvorlage alle meine Eigenschaften im Voraus definieren. Das ist der Hauptgrund, warum ich das frage. –

+2

Haben Sie den JSON als JSON.NET 'JObject'? Wenn ja, sollte https://github.com/destructurama/json-net/ genau das sein, wonach Sie suchen. –

Antwort

0

Ich habe eine in log4net verwendet, um an Seq zu senden. Also, wenn ich die Nachricht austrage, habe ich in der threadContext eine Eigenschaft für jede JProperty in der Json, nur auf der ersten Ebene hinzugefügt. Jetzt in Seq, kann ich nach einer der Json-Eigenschaft suchen. Dies ist ein Beispiel (achten Sie darauf, dass die Nachrichtenvariable vor dem Aufruf dieser Methode eine Json-Zeichenkette sein sollte).

private void AddProperties(string message) 
     { 
      var parsedObject = JObject.Parse(message); 
      foreach (JProperty prop in parsedObject.Properties()) 
      { 
       AddProperty(prop); 
      } 


     } 
     private void AddProperty(JProperty message) 
     { 
      log4net.ThreadContext.Properties[message.Name] = message.Value.ToString(); 
     } 
1

Sie haben Ihren Logger konfigurieren Json.JsonFormatter zu verwenden, und übergeben Sie einfach das Objekt, wenn Informationen Anmeldung, Serilog das Objekt serialisiert werden.

Konfiguration

Log.Logger = new LoggerConfiguration() 
      .WriteTo.RollingFile(new JsonFormatter(), Path.Combine(@"c:\log", "[filename]-{Date}.txt")) 
      .CreateLogger()