[Elastic] logstash JDBC timezone 이슈해결
[이슈]
Mysql에 있는 date 컬럼인 "created"에 "2020-03-01 10:11:03.201108" UTC timezone형식으로 저장되어져 있으나, logstash를 통해서 elasticsearch에 저장 후 kibana에서 볼때, 9시간 이전으로 보여짐.
처리 프로세스
Django Application(Asia/Seoul) : 장고 앱에서는 한국에 맞는 Asia/Seoul timezone을 사용함 (2020-03-01 21:11:03) + 9시간으로 표시됨
|
Mysql (UTC) : DB에는 UTC로 저장됨 (2020-03-01 10:11:03) 표준시간
|
Logstash(input jdbc filter) : Mysql에서 가져온 데이터가 (2020-03-01 01:11:03)로 -9시간이 되어서 가져옴 (이슈1)
|
Logstash(filter date filter) : created 필드를 @timestamp로 복사
|
Logstash(output elasticsearch)
|
Elasticsearch(UTC, ISO8601 포맷)
|
kibana : Elasticsearch에 있는 UTC를 한국시간으로 변경이 안됨 (이슈2)
[원인1]
Logstash input jdbc filter가 Mysql에서 데이터를 가져올때, -9시간으로 가져온다. 아마도 UTC timezone을 설정하지 않아서 로컬 Asia/Seoul timezone을 사용하여 발생하는 문제임.
Mysql : "2020-03-01 10:11:03.201108"
Logstash input jdbc filter : "2020-03-01T01:11:03.201Z" - 9시간 이전 데이터 리턴 (ISO8601 포맷)
[해결책1]
jdbc_default_timezone => "UTC" 추가
Mysql에 있는 date 컬럼인 "created"에 "2020-03-01 10:11:03.201108" UTC timezone형식으로 저장되어져 있으나, logstash를 통해서 elasticsearch에 저장 후 kibana에서 볼때, 9시간 이전으로 보여짐.
처리 프로세스
Django Application(Asia/Seoul) : 장고 앱에서는 한국에 맞는 Asia/Seoul timezone을 사용함 (2020-03-01 21:11:03) + 9시간으로 표시됨
|
Mysql (UTC) : DB에는 UTC로 저장됨 (2020-03-01 10:11:03) 표준시간
|
Logstash(input jdbc filter) : Mysql에서 가져온 데이터가 (2020-03-01 01:11:03)로 -9시간이 되어서 가져옴 (이슈1)
|
Logstash(filter date filter) : created 필드를 @timestamp로 복사
|
Logstash(output elasticsearch)
|
Elasticsearch(UTC, ISO8601 포맷)
|
kibana : Elasticsearch에 있는 UTC를 한국시간으로 변경이 안됨 (이슈2)
[원인1]
Logstash input jdbc filter가 Mysql에서 데이터를 가져올때, -9시간으로 가져온다. 아마도 UTC timezone을 설정하지 않아서 로컬 Asia/Seoul timezone을 사용하여 발생하는 문제임.
Mysql : "2020-03-01 10:11:03.201108"
Logstash input jdbc filter : "2020-03-01T01:11:03.201Z" - 9시간 이전 데이터 리턴 (ISO8601 포맷)
[해결책1]
jdbc_default_timezone => "UTC" 추가
input {
jdbc {
jdbc_driver_library => "/Users/iDongkil/dev/elastic/logstash-7.6.0/mysql-connector/mysql-connector-java-8.0.19.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://prefity.cxngkgvluoq4.ap-northeast-2.rds.amazonaws.com:3306/jone"
jdbc_user => "dbadmin"
jdbc_password => "nadaimma"
schedule => "* * * * *"
statement => "SELECT * from homepage_obslog where id > :sql_last_value"
use_column_value => true
tracking_column => "id"
last_run_metadata_path => "/Users/iDongkil/dev/elastic/logstash-7.6.0/count/.jone_jdbc_last_run"
jdbc_default_timezone => "UTC"
}
}
filter {
mutate {
copy => {"created" => "@timestamp"}
add_tag => [ "mutate_copy_created_%{created}", "mutate_copy_@timestamp_%{@timestamp}" ]
}
# mutate {
# convert => { "created" => "string" }
# add_tag => [ "mutatefilter_%{created}" ]
# }
# date {
# match => [ "created", "ISO8601" ]
# locale => "ko"
# timezone => "UTC"
# add_tag => [ "datefilter_%{created}" ]
# }
}
output {
elasticsearch {
index => 'obslog_jone_%{+YYYY.MM}'
hosts => [ "localhost:9200" ]
}
}
logstash가 실행중인 서버의 timezone을 변경한다.
logstash가 실행중인 서버의 timezone을 변경한다.
Ubuntu 18.04 에서 타임존을 설정하는 방법입니다.
현재 시스템의 타임존을 확인합니다.
# timedatectl
Local time: Fri 2019-04-19 07:53:45 UTC
Universal time: Fri 2019-04-19 07:53:45 UTC
RTC time: n/a
Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
설정할 타임존 값을 확인합니다. 여기선 서울로 설정합니다.
# timedatectl list-timezones | grep Seoul
Asia/Seoul
위에서 확인한 타임존 값으로 설정합니다.
# sudo timedatectl set-timezone Asia/Seoul
변경한 타임존이 적용되었는지 확인합니다.
# timedatectl
Local time: Fri 2019-04-19 16:57:40 KST
Universal time: Fri 2019-04-19 07:57:40 UTC
RTC time: n/a
Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
systemd-timesyncd.service active: yes
RTC in local TZ: no
[원인2]
kibana는 elasticsearch에 UTC로 저장된 데이터를 보여줄때, 해당 브라우저의 timezone에 맞게 자동으로 반영된다. 또는 timezone을 변경할 수 있다.
[해결책2]
kibana -> management -> Advanced Settings -> date format.tz을 "Asia/Seoul"로 변경한다.
댓글
댓글 쓰기