首页 > 解决方案 > 为什么logstash会抛出与SQL Server数据的夏令时差的错误

问题描述

我们使用 LogStash 7.3.2 版来获取 SQL Server 数据。

它工作正常,但有时会抛出异常:

Exception when executing JDBC query {:exception=>#
transition (daylight savings time 'gap'): 1942-09-01T00:00:00.000 (Asia/Kolkata)>}

当我签入 SQL 服务器时,没有像 1942-09-01T00:00:00.000 这样的值。

我的 LogStash 配置如下:

        jdbc_connection_string => "jdbc:sqlserver://HOST:PORT;databaseName=DB_NAME;integratedSecurity=false

        jdbc_user => "USERNAME"
        jdbc_password => "PASSWORD"
        jdbc_driver_library => "/home/user/LOGSTASH/mssql-jdbc-7.4.1.jre8.jar"
        jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
        statement => "SELECT * FROM TABLE_NAME  where   INCR_COLUMN  >  :sql_last_value  "
        schedule => "*/60 * * * * *"
        use_column_value => true
        tracking_column => "INCR_COLUMN"
        tracking_column_type => "timestamp"
        record_last_run => true
        last_run_metadata_path => "/home/user/LOGSTASH/LAST_RUN/.mssql_USERS_logstash_jdbc_last_run"
        connection_retry_attempts => "1000"
        connection_retry_attempts_wait_time => "60"
        jdbc_default_timezone => "UTC"

注意:在 SQL Server 中 INCR_COLUMN 定义为 DateTime。

对此的任何帮助将不胜感激。

标签: sql-serverlogstashlogstash-configurationlogstash-jdbc

解决方案


Logstash 中,如果datetime字符串没有TZ part,则假定为UTC time.

如果您知道日期时间是本地时间字符串,那么您需要告诉日期过滤器生成日期的时区。您可以使用 Joda 时区之一,

例如America/New_YorkAmerica/DetroitEST5EDT- 这些只是指向时区 Java 代码的标签,这些 Java 代码知道过去相当长一段时间内所有时区的时钟发生了哪些变化。

有关如何遵循更新的信息,请参阅此页面。http://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html 100

一旦 datetime 字符串被转换为 Timestamp 对象(通过日期过滤器),它就被认为是UTC time.


推荐阅读