日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

date时区 es logstash_elastic date时区问题解决办法

發布時間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 date时区 es logstash_elastic date时区问题解决办法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前介紹filter date插件時就談到時區問題,但是沒有說明白。最近在使用range查詢時間范圍內的數據時出現了數據量不一致的情況。特地了解了下ELK Stack中關于時區的問題。

問題:

使用kibana discovery界面搜索時,數據量一致。使用curl 搜索時少了數據。

再說時間問題前,簡單了解下UTC:

UTC(Universal Time Coordinated) 叫做世界統一時間,中國大陸和 UTC 的時差是 + 8 ,也就是 UTC+8。

UTC時區參考文檔

查看官方文檔后得到的結論:

ELK Stack集群各服務對時間處理的介紹:

logstash :根據所在機器的時區并對date類型數據進行處理,整理成UTC時間

elastic :所有date類型數據都存儲為GMT(毫秒級)

kibana :根據kibana配置的時區,從elastic取出的timestamp時間轉換為相應時區的時間。

問題原因:

logstash處理后以UTC時間存儲進elastic,kibana取出來后,在恢復成相應時區的時間。因為我機器都是CST的時間,所以使用kibana搜索沒有問題,但是curl命令不會對所取出來的時間進行時區轉換,所以就少了8小時數據。

解決方法:

一:

logstash 過濾字段信息時,刪除或分開匹配時間和時區信息,timestamp只匹配具體時間,timezone則匹配+0800這樣的時區信息,并同時定義timezone為UTC,這樣從根本上就得到原始的時間。

UTC時間的示例:

$ bin/logstash -f text.conf

[26/Mar/2019:00:00:08 +0800] #這里以nginx日志中的時間為例

{

"timestamp" => "26/Mar/2019:00:00:08",

"message" => "[26/Mar/2019:00:00:08 +0800]",

"@timestamp" => 2019-03-26T00:00:08.000Z, #@timestamp的時間和輸入的時間一致

"@version" => "1",

"timezone" => "+0800",

"host" => "node2007"

}

$ cat text.conf

input {

stdin {}

}

filter {

grok {

match => {

"message" => "\[%{NOTSPACE:timestamp} %{INT:timezone}\]"

}

}

date {

match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss" ]

timezone => "UTC" #無法從timestamp中提取時區。設置時區為UTC時間,忽略系統時區,如果date插件中的match匹配到了時區,則此處的時區不生效。所以在grok插件中將timezone和timestamp分隔開

}

}

output {

stdout{

codec => rubydebug

}

}

正常時間處理:

$ bin/logstash -f text.conf

[26/Mar/2019:00:00:08 +0800]

{

"@version" => "1",

"@timestamp" => 2019-03-25T16:00:08.000Z, #轉換成UTC時間,減少8小時,

"message" => "[26/Mar/2019:00:00:08 +0800]",

"host" => "node2007",

"timestamp" => "26/Mar/2019:00:00:08 +0800"

}

$ cat text.conf

input {

stdin {}

}

filter {

grok {

match => {

"message" => "\[%{HTTPDATE:timestamp}\]"

}

}

date {

match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]

timezone => "UTC"

}

}

output {

stdout{

codec => rubydebug

}

}

系統日志中不帶有時區信息,則可以直接在配置文件中指定timezone => "UTC"即可。無需要做匹配工作。

二:

匹配到時區時間沒有關系,可以在過濾時,在把時間補回來。

...

date {

match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]

target => "time"

}

ruby {

code => "event.set('timestamp', event.get('time').time.localtime + 8*60*60)" #處理時將logstash自動減少的時間在給加回來

}

ruby {

code => "event.set('@timestamp',event.get('timestamp'))"

}

...

以上代碼經過我測試,可以正常使用。這里使用ruby插件,我不懂,time -> timestamp -> @timestamp需要經由兩個變量才能最后賦值給@timestamp,為什么不能直接使用@timestamp處理并賦值,如果有懂得的人,還請留言告知。

對時間進行處理后,我們可以使用curl命令隨意進行查詢啦,但是使用kibana時,還需要設置一下默認的時區: Management -> kibana(高級設置) -> Timezone for date formatting 并選擇UTC時間展示。

![](https://img2018.cnblogs.com/blog/1202606/201903/1202606-20190328154358262-1829927564.png)

總結:

ELK Stack一整套組合拳的時區特性特別好用,但是在國內還是統一時區吧。統一時區還是再數據存儲前做調整,否則后期查詢會流淚的。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的date时区 es logstash_elastic date时区问题解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。