2016-07-11 3 views
3

Я новичок в ES и Serilog, но мои поиски еще не дали ответа. Я пытаюсь выяснить, как использовать Serilog для отправки данных в Elasticsearch таким образом, что если данные содержат поля (например, если это объект, который имеет общедоступные свойства), данные отображаются в ES с такими свойствами, как поля. До сих пор я дошел до использования RenderedCompactJsonFormatter и анонимных типов, чтобы иметь возможность достичь этого в основном (см. Ниже), но он все еще производит именованные поля, где данными в полях являются все, кроме «новой» части от типа декларации анонимной:Как отправить данные Serilog в Elasticsearch с полями

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

Это производит:

@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 

есть ли лучший способ сделать это так, что наши данные могут быть найдены/визуализировали с использованием полей в ES (и Kibana)?

+1

Привет Ant, вы видели: https://github.com/serilog/serilog-sinks-elasticsearch? Может помочь с этой задачей. –

+0

Да, я использую ваши замечательные инструменты :), но я думаю, что я либо пропустил, где объяснил, как это сделать, либо, может быть, (скорее?) Я слишком зеленый с ES и Serilog, и в противном случае знал бы, как это сделать это с большим опытом. Я кратко обновляю вопрос, чтобы показать, как я построил регистратор и раковину, чтобы лучше разъяснить ситуацию. – Ant

ответ

0

Я понял. Я изменил конструкцию, чтобы использовать ElasticsearchJsonFormatter. Так как регистратор, казалось, чтобы иметь возможность разобрать имя поля из сообщения, я перешел к объекту и передается в свойствах вместо того, чтобы:

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

, который произвел гораздо более читаемым выход в ES:

"_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 
    } 
    } 
Смежные вопросы