2016-08-17 7 views
2

에 입력하는 Serilog 진정한 AutoRegisterTemplate =와 ElasticSearch 침몰탄성 검색 매핑 강하게 내가 사용하는 .NET

{ 
 
"@timestamp": "2016-08-17T08:57:37.3487446+02:00", 
 
"level": "Information", 
 
"messageTemplate": "User login {UserId}", 
 
"message": "User login ..., 
 
"fields": { 
 
    "UserId": "...", 
 
    "ProcessId": 15568, 
 
    "ThreadId": 14, 
 
    "MachineName": "...", 
 
    "EnvironmentUserName": "...", 
 
    "HttpRequestId": "...", 
 
    "HttpRequestClientHostIP": "::1", 
 
    "HttpRequestType": "POST", 
 
    "Version": "1.0.0.0" 
 
    } 
 
}

ElasticSearch에 다음과 같은 저장

DynamicResponse를 사용하여 색인을 쿼리 할 수 ​​있습니다.

  var searchResponse = client.Search<DynamicResponse>(s => s 
      .Index("logstash-*") 
      .AllTypes() 
      .Size(50) 
      .Query(q => q.Bool(b => b.Must(bs => bs.Term(p => p.Field("fields.UserId.raw").Value("...")))) 
      ) 
     ); 

그러나 결과에 대해 강력한 형식의 클래스를 사용하고 싶습니다.

다음 클래스를 사용해 보았습니다.

 public class LogResponse 
    { 
     public string Message { get; set; } 
     [Date(Name = "@timestamp")] 
     public DateTime Timestamp { get; set; } 
     public LogResponseFields Fields { get; set; } 

     public class LogResponseFields 
     { 
      public Guid UserId { get; set; } 
     } 
    } 

그러나 타임 스탬프가 설정되지 않은, DateTime.Min에 대한 기본값은 모두 메시지와 사용자 아이디가 올바르게 매핑됩니다.

@timestamp 필드를 매핑하는 방법은 무엇입니까?

+0

Elasticsearch의 매핑은 어떻게됩니까? –

답변

0

타임 스탬프 필드에 대한 매핑이 올바르게 작동하고 있습니다. 여기이 나를 위해

17/08/2016 4:57:37 PM 

를 출력

void Main() 
{ 
    var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
    var defaultIndex = "logstash-" + DateTime.UtcNow.ToString("yyyy-MM-dd"); 
    var connectionSettings = new ConnectionSettings(pool) 
      .DefaultIndex(defaultIndex) 
      .InferMappingFor<LogResponse>(m => m 
       .TypeName("log") 
      ); 

    var client = new ElasticClient(connectionSettings); 

    // delete the index if it exists. Useful for demo purposes 
    if (client.IndexExists(defaultIndex).Exists) 
    { 
     client.DeleteIndex(defaultIndex); 
    } 

    // use the lowlevel client to send the exact json as 
    // it would be sent from the source 
    var createResponse = client.LowLevel.Index<string>(
     defaultIndex, 
     "log", 
     @"{ 
      ""@timestamp"": ""2016-08-17T08:57:37.3487446+02:00"", 
      ""level"": ""Information"", 
      ""messageTemplate"": ""User login {UserId}"", 
      ""message"": ""User login .."", 
      ""fields"": { 
       ""UserId"": ""29a35806-15d2-4eed-a3bf-707760e426b8"", 
       ""ProcessId"": 15568, 
       ""ThreadId"": 14, 
       ""MachineName"": ""..."", 
       ""EnvironmentUserName"": ""..."", 
       ""HttpRequestId"": ""..."", 
       ""HttpRequestClientHostIP"": ""::1"", 
       ""HttpRequestType"": ""POST"", 
       ""Version"": ""1.0.0.0"" 
      } 
     }"); 

    if (!createResponse.SuccessOrKnownError) 
    { 
     Console.WriteLine("Error indexing document"); 
    } 

    // Refresh the index after indexing. Useful for demo purposes. 
    client.Refresh(defaultIndex); 

    var searchResponse = client.Search<LogResponse>(s => s 
     .AllTypes() 
     .Size(50) 
     .Query(q => q 
      .MatchAll() 
     ) 
    ); 

    foreach (var document in searchResponse.Documents) 
    { 
     Console.WriteLine(document.Timestamp); 
    } 
} 

public class LogResponse 
{ 
    public string Message { get; set; } 
    [Date(Name = "@timestamp")] 
    public DateTime Timestamp { get; set; } 
    public LogResponseFields Fields { get; set; } 

    public class LogResponseFields 
    { 
     public Guid UserId { get; set; } 
    } 
} 

입증하는 완벽한 예입니다 (이 직렬화 복원 된 내 DateTime 로컬).

0

DateTimeOffset은 시간대 정보가 포함 된 타임 스탬프로 보입니다. (+02:00 특히)

0

입력 해 주셔서 감사합니다.

내가 게시 할 예를 만들 때 문제가 해결되었습니다.

내 실제 코드이었다 : 그래서

public class LogResponse : DynamicResponse 

DynamicResponse의 상속에게 모든 일을하고있다

public class LogResponse 

을 제거하여.