2017-03-08 104 views
1

Logstash 5.2.1爲什麼Logstash將錯誤的時區放在〜/ .logstash_jdbc_last_run中?下面

的結構是OK,則局部更新沃金。我只是誤解了結果以及Logstash如何使用時區。

jdbc_default_timezone 時區轉換。 SQL不允許timestamp字段中的時區數據。此插件會自動將您的SQL時間戳字段轉換爲Logstash時間戳,相對UTC時間採用ISO8601格式。 使用此設置將手動分配指定的時區偏移量,而不是使用本地機器的時區設置。例如,您必須使用規範時區,歐洲/羅馬。


我想指數從一個PostgreSQL的一些數據與Logstash幫助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 | [email protected]   | Jim  | Smith 
    2 | 2017-03-07 18:09:25.3756 |       | John  | Smith 
    3 | 2017-03-07 18:09:25.384053 | [email protected]  | Carol  | Smith 
    4 | 2017-03-07 18:09:25.869833 | [email protected]   | Sam  | 
    5 | 2017-03-08 10:04:26.39423 | [email protected]  | T   | Rex 

數據庫導入數據是這樣的:

INSERT INTO contacts(timestamp, email, first_name, last_name) VALUES(current_timestamp, '[email protected]', 'Sam', null); 

爲什麼Logstash把錯誤的時區~/.logstash_jdbc_last_run?以及如何解決它?

回答

1

2017-03-08 09:29:00.259000000 Z的意思是UTC時區,這是正確的。

+0

好的,那麼爲什麼我會連續導入第5個DB記錄?看看更新問題。 – trex

+0

對不起,我以前的評論是誤導。我在Logstash中配置了'jdbc_default_timezone =>「Europe/Rome」''。所以,我必須有羅馬時區,不是嗎? – trex

+0

'時區轉換。 SQL不允許timestamp字段中的時區數據。此插件會自動將您的SQL時間戳字段轉換爲Logstash時間戳,相對UTC時間採用ISO8601格式。' 所以導入後的時區總是'UTC',這個設置只用於轉換 –

1

它默認爲UTC時間。

filter { 
    mutate { 
    add_field => { 
     # Create a new field with string value of the UTC event date 
     "timestamp_extract" => "%{@timestamp}" 
    } 
    } 

    date { 
    # Parse UTC string value and convert it to my timezone into a new field 
    match => [ "timestamp_extract", "yyyy-MM-dd HH:mm:ss Z" ] 
    timezone => "Europe/Rome" 
    locale => "en" 
    remove_field => [ "timestamp_extract" ] 
    target => "timestamp_europe" 
    } 
} 

這將轉換時區,首先提取時間戳成timestamp_extract字段,然後將其轉換:如果您想將其存儲在不同的時區,您可以通過添加像這樣一個過濾器轉換時間戳進入歐洲/羅馬時區。新轉換後的時間戳放入timestamp_europe字段中。

希望它現在更清晰。

相關問題