ELK時間戳
在我們使用ELK過程中,總會遇到時間戳的問題。首先
logstash
如果沒有加以處理的話,那么它默認使用的是采集的時間戳,然后存入ES
。那么這樣的話時間顯示的是錯誤的,再接着因ES
默認使用的是UTC時間,那么我們在看數據的時候,看到的時間與實際的時間也是慢8小時的,但Kibana
默認使用的是你瀏覽器的時區,所以這一塊問題不是很大,如果在你logstash
時間處理是正常的情況下,kibana
看的時候發現時間不正常的話,那么我們只需在web界面修改一下時區即可達到時間正確的目的。接下來我就logstash
時間問題來看一下相關配置。
例子,我就拿我前幾天部署的mysql慢日志來做例子吧,yaml
文件如下:
input {
redis {
host => "10.228.81.51"
port => 6379
password => "123456"
db => "1"
data_type => "list"
key => "mysqllog"
}
}
filter {
json {
source => "message"
}
grok {
match => [ "message" , "(?m)^#\s+User@Host:\s+%{USER:user}\[[^\]]+\]\s+@\s+(?:(?<clienthost>\S*) )?\[(?:%{IPV4:clientip})?\]\s+Id:\s+%{NUMBER:row_id:int}\n#\s+Query_time:\s+%{NUMBER:query_time:float}\s+Lock_time:\s+%{NUMBER:lock_time:float}\s+Rows_sent:\s+%{NUMBER:rows_sent:int}\s+Rows_examined:\s+%{NUMBER:rows_examined:int}\n\s*(?:use %{DATA:database};\s*\n)?SET\s+timestamp=%{NUMBER:timestamp};\n\s*(?<sql>(?<action>\w+)\b.*;)\s*(?:\n#\s+Time)?.*$" ]
}
date { # 將日志的 timestamp 時間字段,轉成UNIX格式后,並賦值給默認的時間戳
locale => "en"
match => ["timestamp","UNIX"]
target => "@timestamp"
}
ruby { ##設置一個自定義字段'timecode'[這個字段可自定義],將默認時間戳中的值加8小時后並重新賦值給 timecode
code => "event.set('timecode', event.get('@timestamp').time.localtime + 8*3600)"
}
#ruby {#設置一個自定義字段 'time' 字段,然后將上一步自定義 ‘timecode’ 時間字段中的值重新賦給 time 自定義字段
# 因生成環境需要,所我不需要將默認時間戳加八小時
# 如果需要es展示的就是加八小時的時間戳的話,那么可以直接將 date 字段中的內容注釋掉,然后打開這一塊內容。並將 'time' 字段修改成 '@timestamp' 字段。那么logstash所看到的時間戳則是 加八小時后的時間
# code => "event.set('time',event.get('timecode'))"
#}
# mutate {
# remove_field => ["timecode"]
# }
}
output {
#stdout {
# codec => rubydebug
#}
if [tags][0] == "mysql-slow-log" {
elasticsearch {
hosts => ["10.228.81.51:9200"]
index => "%{[tags][0]}-%{+YYYY.MM.dd}"
}
}
}