kibana默認的是按照客戶端的采集時間(@timestamp)進行排序,這往往不是我們所需要的,我們需要的是對日志實際時間進行排序,要解決這個問題,有很多種方法,可以在elasticsearch建立索引,不采取默認的索引模式,當然這種方法比較繁瑣,需要懂得如何在elasticsearch建立索引及運用索引;今天我們主要研究的是另一種方法,通logstash的過濾插件將日志時間轉換成默認@timestamp進行排序;
1、我們要解析的時間格式是標准的java日期格式:
2019-06-18 10:21:49,755
2、一般解析:
input { stdin {} } filter { grok { match => ["message", "%{TIMESTAMP_ISO8601:times}"] } } output { stdout { codec=>rubydebug{} } }
將我們的時間解析出來
可以發現@timestamp為我們實際的采集時間,而time才是我們所需要的日志時間。
3、使用data插件解析:
input { stdin {} } filter { grok { match => ["message", "%{TIMESTAMP_ISO8601:times}"] } date { match => ["times", "yyyy-MM-dd HH:mm:ss,SSS"] } } output { stdout { codec=>rubydebug{} } }
這里的"yyyy-MM-dd HH:mm:ss,SSS"是時間格式,常用的格式有:
nginx access日志:"dd/MMM/yyyy:HH:mm:ss Z" nginx error日志:"yyyy/MM/dd HH:mm:ss" tomcat access日志:"dd/MMM/yyyy:HH:mm:ss Z" tomcat catalina.out日志:"yyyy-MM-dd HH:mm:ss,SSS"
date其他詳細內容介紹見官網https://www.elastic.co/guide/en/logstash/6.8/plugins-filters-date.html;
通過解析可以看到已經解析出我們需要的時間,但是可以看到解析出來的時間要比實際時間少了八個小時,並且第一次解析還會有提示,大致的意思是該文件已經棄用,在低版本,是可以通過修改這個文件來修復時間,現在棄用了,只能使用配置來滿足需求。具體是通過在date下添加參數,並移除多余字段。
input { stdin {} } filter { grok { match => ["message", "%{TIMESTAMP_ISO8601:times}"] } date { match => ["times", "yyyy-MM-dd HH:mm:ss,SSS"] locale => "en" timezone => "+00:00" remove_field => "times" } } output { stdout { codec=>rubydebug{} } }
經解析
通過最后一次解析,達到了我們的需求;
有時候通過上面的方法,可能也會不成功,那么可以使用下面這種方法,在解析時間時,更新@timestamp
事件的字段;雖然是默認更新,但是由於某些原因,並不能默認解析,需要手動添加
date { match => ["times", "yyyy-MM-dd HH:mm:ss"] target => "@timestamp" }
到此本次研究結束,可以將配置導入到生產中!