[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" 추가


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을 변경한다. 


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"로 변경한다.

댓글

이 블로그의 인기 게시물

[Django Install] 11. Install Python3 for Centos8/RedhatLinux8

[windows] filebeat 스케쥴링 테스트

[sqlite] error 조치