2016-07-11 11 views
3

Ich bin neu in ES und Serilog, aber meine Suchen haben diese Antwort noch nicht produziert. Ich versuche herauszufinden, wie Serilog verwendet wird, um Daten an Elasticsearch zu senden, so dass die Daten in ES mit diesen Eigenschaften angezeigt werden, wenn die Daten Felder enthalten (z. B. wenn es sich um ein Objekt mit öffentlichen Eigenschaften handelt) Felder. Bisher bin ich soweit, einen RenderedCompactJsonFormatter und anonyme Typen zu verwenden, um dieses meist (siehe unten) zu erreichen, aber das erzeugt noch benannte Felder, in denen die Daten in den Feldern alles außer dem "neuen" Teil sind der anonymen Typdeklaration:So senden Serilog-Daten an Elasticsearch mit Feldern

  var log = new LoggerConfiguration() 
       .MinimumLevel.Information() 
       .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/test_srpostimes")) 
       { 
        InlineFields = true, 
        IndexDecider = (@event,offset) => "test_elapsedtimes", 
        CustomFormatter = new RenderedCompactJsonFormatter() 
       }) 
       .WriteTo.Console() 
       .CreateLogger(); 
      var elapsedTime = new {Time = 64}; 
      var timeStamp = new {Timestamp = DateTime.Now}; 
      var transID = new {TransID = "551674"}; 

      log.Information("{timeStamp} {transID} {elapsedTime}", timeStamp, transID, elapsedTime); 

Dies erzeugt:

@t: 
    2016-07-11T18:45:35.0349343Z 
@m: 
    "{ Timestamp = 7/11/2016 2:45:35 PM }" "{ TransID = 551674 }" "{ Time = 64 }" 
@i: 
    b3ee2c05 
timeStamp: 
    { Timestamp = 7/11/2016 2:45:35 PM } 
transID: 
    { TransID = 551674 } 
elapsedTime: 
    { Time = 64 } 
_id: 
    AVXbR11WjgSgCs5HSlYY 
_type: 
    logevent 
_index: 
    test_srpostimes 
_score: 
    1 

gibt es einen besseren Weg, dies zu tun, so dass unsere Daten durchsucht werden können/visualisiert Felder in eS (und Kibana)?

+1

Hallo Ant, hast du gesehen: https://github.com/serilog/serilog-sinks-elasticsearch? Kann bei dieser Aufgabe helfen. –

+0

Ja, ich habe deine wundervollen Werkzeuge benutzt :) aber ich schätze, ich habe entweder verpasst, wo es erklärt wurde, oder vielleicht (wahrscheinlicher?) Ich bin zu grün mit ES und Serilog und würde es sonst schaffen das mit mehr Erfahrung. Ich werde die Frage kurzzeitig aktualisieren, um zu zeigen, wie ich den Logger konstruiert und abgesenkt habe, um die Dinge besser zu klären. – Ant

Antwort

0

Ich fand es heraus. Ich habe die Konstruktion geändert, um ElasticsearchJsonFormatter zu verwenden. Da der Logger aus der Nachricht in der Lage sein schien den Feldnamen zu analysieren, wechselte ich zu einem Objekt und stattdessen in den Eigenschaften geführt:

 var log = new LoggerConfiguration() 
      .MinimumLevel.Information() 
      .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/test_srpostimes")) 
      { 
       IndexDecider = (@event,offset) => "test_elapsedtimes", 
       CustomFormatter = new ElasticsearchJsonFormatter() 
      }) 
      .WriteTo.Console() 
      .CreateLogger(); 

      var elapsedTimeMessage = new ElapsedTimeMessage(DateTime.Now.Millisecond); 

      log.Information("{EventTime} {EventId} {ElapsedTime}", elapsedTimeMessage.EventTime, elapsedTimeMessage.EventId, elapsedTimeMessage.ElapsedTime); 

, dass ein viel lesbarer Ausgabe in ES hergestellt:

"_source": { 
    "@timestamp": "2016-07-12T09:03:21.5804873-04:00", 
    "level": "Information", 
    "messageTemplate": "{EventTime} {EventId} {ElapsedTime}", 
    "fields": { 
     "EventTime": "2016-07-12T09:03:21.5754873-04:00", 
     "EventId": "575", 
     "ElapsedTime": 575 
    } 
    } 
Verwandte Themen