2016-08-31 14 views
0

У нас есть установка elasticsearch с kibana, и мне было интересно, могу ли я написать запрос с помощью NEST для отображения файлов журнала .Net-программой?Запросить существующий указатель из поиска elasticsearch с помощью NEST

Я пробовал создать простой класс POCO LogMessage для извлечения сообщений, но безуспешно.

[ElasticsearchType(IdProperty = "Id")] 
public class LogMessage 
{ 
    public Guid? Id { get; set; } 

    public Source Source { get; set; } 
} 

public class Source 
{ 
    public String Message { get; set; } 
} 

Поисковый код очень прост.

var local = new Uri("http://servername:9200"); 
var settings = new ConnectionSettings(local); 
var elastic = new ElasticClient(settings); 
var request = new SearchRequest 
      { 
       From = 0, 
       Size = 10, 
      }; 

var r = elastic.Search<LogMessage>(request); 
  1. Что должен мой класс LogMessage выглядеть?

Событие в кибане выглядит следующим образом. Мы используем serilog для регистрации сообщений elasticsearch сервера

{ 
    "_index": "oxyb-01-2016.08", 
    "_type": "logevent", 
    "_id": "AVbfrnje902hsaMqv0p2", 
    "_score": 1, 
    "_source": { 
    "@timestamp": "2016-08-31T18:19:26.9228089+10:00", 
    "level": "Debug", 
    "messageTemplate": "Simple message", 
    "message": "Simple message", 
    "fields": { 
     "Session": "AP2016831/08/2016 6:10:19 PM", 
     "TX": "TX123-001 None", 
     "ExecutionTime": 523792, 
     "MethodTime": 109, 
     "TransactionId": "6058862c-3f45-4956-8992-eb34eba0fa9b", 
     "Workorder": "WoAP70906YY0831031604526", 
    }, 
    "renderings": { 
     "0": [ 
     { 
      "Format": "0.00", 
      "Rendering": "0.00" 
     } 
     ] 
    } 
    }, 
    "fields": { 
    "@timestamp": [ 
     1472631566922 
    ] 
    } 
} 

ответ

2

Источник находится все в _source собственности в ответ

"_source": { 
    "@timestamp": "2016-08-31T18:19:26.9228089+10:00", 
    "level": "Debug", 
    "messageTemplate": "Simple message", 
    "message": "Simple message", 
    "fields": { 
     "Session": "AP2016831/08/2016 6:10:19 PM", 
     "TX": "TX123-001 None", 
     "ExecutionTime": 523792, 
     "MethodTime": 109, 
     "TransactionId": "6058862c-3f45-4956-8992-eb34eba0fa9b", 
     "Workorder": "WoAP70906YY0831031604526", 
    }, 
    "renderings": { 
     "0": [ 
     { 
      "Format": "0.00", 
      "Rendering": "0.00" 
     } 
     ] 
    } 
    }, 

так что ваш LogMessage типа должен иметь свойства для каждого из них. Похоже, fields может содержать произвольные ключи? Если это так, вы можете отобразить его как Dictionary<string, object>; если это не так, тогда нарисуйте его также как определенный тип POCO. В простейшем случае такое отображение, как это будет работать

[ElasticsearchType(Name = "logevent")] 
public class LogMessage 
{ 
    [JsonProperty("@timestamp")] 
    public DateTimeOffset Timestamp {get; set; } 

    public string Level {get; set; } 

    public string MessageTemplate {get; set; } 

    public string Message {get; set; } 

    public Dictionary<string, object> Fields {get; set; } 

    public Dictionary<string, object[]> Renderings {get; set; } 
} 

Мы можем проверить это работает, как ожидается, со следующими

void Main() 
{ 
    var client = new ElasticClient(); 

    var json = @"{ 
    ""@timestamp"": ""2016-08-31T18:19:26.9228089+10:00"", 
    ""level"": ""Debug"", 
    ""messageTemplate"": ""Simple message"", 
    ""message"": ""Simple message"", 
    ""fields"": { 
     ""Session"": ""AP2016831/08/2016 6:10:19 PM"", 
     ""TX"": ""TX123-001 None"", 
     ""ExecutionTime"": 523792, 
     ""MethodTime"": 109, 
     ""TransactionId"": ""6058862c-3f45-4956-8992-eb34eba0fa9b"", 
     ""Workorder"": ""WoAP70906YY0831031604526"", 
    }, 
    ""renderings"": { 
     ""0"": [ 
      { 
      ""Format"": ""0.00"", 
      ""Rendering"": ""0.00"" 
     } 
     ] 
    } 
    }"; 

    LogMessage log = null; 

    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) 
    log = client.Serializer.Deserialize<LogMessage>(stream); 

    // do something with log 
}