为什么Logstash将错误的时区放在〜/ .logstash_jdbc_last_run中?

时间:2017-03-08 09:36:42

标签: logstash logstash-configuration logstash-jdbc

Logstash 5.2.1

以下配置为Ok,部分更新正在进行中。我只是误解了结果以及Logstash如何使用时区。

jdbc_default_timezone 时区转换。 SQL不允许时间戳字段中的时区数据。此插件将自动将SQL时间戳字段转换为Logstash时间戳,采用ISO8601格式的相对UTC时间。 使用此设置将手动分配指定的时区偏移量,而不是使用本地计算机的时区设置。例如,您必须使用规范时区,欧洲/罗马。

我想借助Logstash将一些数据从PostgreSQL索引到Elasticseach。部分更新应该有效。

但在我的情况下,Logstash将错误的时区放在~/.logstash_jdbc_last_run

$cat ~/.logstash_jdbc_last_run 
--- 2017-03-08 09:29:00.259000000 Z

我的电脑/服务器时间:

$date
mer  8 mar 2017, 10.29.31, CET
$cat /etc/timezone 
Europe/Rome

我的Logstash配置。:

input {
  jdbc {
    # Postgres jdbc connection string to our database, mydb
    jdbc_connection_string => "jdbc:postgresql://localhost:5432/postgres"
    # The user we wish to execute our statement as
    jdbc_user => "logstash"
    jdbc_password => "logstashpass"
    # The path to our downloaded jdbc driver
    jdbc_driver_library => "/home/trex/Development/ship_to_elasticsearch/software/postgresql-42.0.0.jar"
    # The name of the driver class for Postgresql
    jdbc_driver_class => "org.postgresql.Driver"
    jdbc_default_timezone => "Europe/Rome"
    # our query
    statement => "SELECT * FROM contacts WHERE timestamp > :sql_last_value"
    # every 1 min
    schedule => "*/1 * * * *"
  }
}
output {
  stdout { codec => json_lines }
  elasticsearch {
    hosts => [ "localhost:9200" ]
    index => "database.%{+yyyy.MM.dd.HH}"
  }
}

没有jdbc_default_timezone时区也是错误的。

我的PostgeSQL数据:

postgres=# select * from "contacts";                                                                                               uid |         timestamp          |          email          | first_name | last_name
-----+----------------------------+-------------------------+------------+------------
   1 | 2017-03-07 18:09:25.358684 | jim@example.com         | Jim        | Smith
   2 | 2017-03-07 18:09:25.3756   |                         | John       | Smith
   3 | 2017-03-07 18:09:25.384053 | carol@example.com       | Carol      | Smith
   4 | 2017-03-07 18:09:25.869833 | sam@example.com         | Sam        |
   5 | 2017-03-08 10:04:26.39423  | trex@example.com        | T          | Rex

DB数据的导入如下:

INSERT INTO contacts(timestamp, email, first_name, last_name) VALUES(current_timestamp, 'sam@example.com', 'Sam', null);

为什么Logstash在~/.logstash_jdbc_last_run中放错了时区?以及如何解决它?

2 个答案:

答案 0 :(得分:2)

2017-03-08 09:29:00.259000000 Z表示UTC时区,这是正确的。

答案 1 :(得分:1)

默认为UTC时间。如果您想将其存储在不同的时区,可以通过添加如下过滤器来转换时间戳:

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.5.2</version>
            <executions>
                <execution>
                    <id>install-external1</id>
                    <phase>clean</phase>
                    <configuration>
                        <file>${basedir}/resources/storm-eventhubs-1.0.2-jar-with-dependencies.jar</file>
                        <repositoryLayout>default</repositoryLayout>
                        <groupId>com.microsoft.eventhubs</groupId>
                        <artifactId>eventhubs-storm-spout</artifactId>
                        <version>1.0.2</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

这将转换时区,首先将时间戳提取到timestamp_extract字段,然后将其转换为Europe / Rome时区。并将新转换的时间戳放在timestamp_europe字段中。

希望现在更清楚。