logstash 寫入數據到elasticsearch 索引相差8小時解決辦法


問題說明

Logstash用的UTC時間, logstash在按每天輸出到elasticsearch時,因為時區使用utc,造成每天8:00才創建當天索引,而8:00以前數據則輸出到昨天的索引

# 使用logstash寫入elasticsearch時的配置
output {
elasticsearch {
id => "logstash-%{+YYYY.MM.dd}"
}
}
1
2
3
4
5
6
logstash和elasticsearch是按照UTC時間的,kibana卻是按照正常你所在的時區顯示的,是因為kibana中可以配置時區信息。

解決問題

添加一個字段

該字段利用logstash的fileter進行生成,由多種方式實現,新生成的字段為timestamp如下

# ruby 插件實現
ruby {
code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}

# grok 從日志正則匹配得到
grok {
match => {"message"=> "%{TIMESTAMP_ISO8601:timestamp}"}
}

# date 把日志時間重寫為@timestamp
#date {
# match => ["message", "^\[(?<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3})"]
# target => "@timestamp"
# timezone => "+08:00"
#}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
用mutate插件對數據進行轉換,提取想要的日期字段

# convert轉換為string類型,gsub只處理string類型的數據,在用正則匹配,最終得到想要的日期
mutate {
convert => ["timestamp", "string"]
gsub => ["timestamp", "T([\S\s]*?)Z", ""]
gsub => ["timestamp", "-", "."]
}
1
2
3
4
5
6
配置output

elasticsearch {
hosts => ["localhost:9200"]
index => "log-%{timestamp}"
}
1
2
3
4
注意:在使用grok進行正則匹配是,可以使用的方法可以參考這里
https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html
grok 測試平台
http://grokdebug.herokuapp.com/
————————————————
版權聲明:本文為CSDN博主「40kuai」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u012881331/article/details/88313045


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM