Logstash에서 ElasticSearch로 데이터를 저장할 때 날짜 필드의 Timezone이 항상 헷갈린다. 특히 저장된 데이터를 Kibana를 통해 시각화할 때 이 부분이 제대로 정리 안되어 있으면 골치 아픈 상황이 발생하기 때문에 명확히 정리하고 넘어가자.
Logstash에는 날짜 필드를 설정해주는 Date 필터가 존재한다. Date 필터는 원본 날짜 데이터를 파싱하기 위해 Timezone, Locale 속성을 제공한다.
Date 필터는 원본 날짜 데이터를 Timezone, Locale 파라미터를 사용하여 분석하고 이를 ElasticSearch에 전달하면 UTC 기준으로 날짜 데이터가 저장된다.
Kibana에서는 UTC 기준으로 저장된 데이터를 어떤 타임존으로 변환해서 보여줄지 설정(설정-고급설정-타임존) 할 수 있으며, 기본값은 브라우저 설정값이다.
예를 들어,
logstash에서 수집하는 원본 데이터는 한국시간(+9:00)이며 2020–09–07 09:10:10 로 저장되어 있다고 가정할 경우, logstash에서 Date 필터를 통해 아래와 같이 날짜 값을 파싱 하고 elasticsearch로 전송한다.
date {
match => ["creation_datetime", "YYYY-MM-dd HH:mm:ss"]
timezone => "Asia/Seoul"
locale => "ko"
target => "new_datetime"
}
elasticsearch에는 2020–09–07T00:10:10.000Z 로 저장되며, kibana에는 설정에서 이를 어떤 타임존 기준으로 보여줄지 설정하여 사용한다.
만약, logstash Date 필터로 타임존을 설정하지 않을 경우 아래처럼 문제가 될 수 있다.
원본 데이터는 한국시간이며 2020–09–07 09:10:10로 저장되어 있고, logstash에서 변환하지 않았으나 자동으로 날짜 필드로 인식(UTC)된다.
elasticsearch에는 2020–09–07T09:10:10.000Z 로 저장되며, 이를 kibana에서 한국시간 기준으로 데이터를 보여줄 경우 9시간이 더해져서 2020–09–07 18:10:10 로 표시되는 문제가 발생한다.