對於ELK還不太熟悉的同學可以參考我前面的兩篇文章ElasticSearch + Logstash + Kibana 搭建筆記、Log stash學習筆記(一),本文搭建了一套專門訪問Apache的訪問日志的ELK環境,能夠實現訪問日志的可視化分析。
數據源 Filebeat + Logstash
數據源對應Logstash中的Input部分,本文采用Filebeat來讀取Apache日志提供給Logstash,Logstash進行日志解析輸入到ES中進行存儲。Filebeat的配置比較簡單,參考文章Log stash學習筆記(一)。需要注意的是,如果Filebeat之前發送過數據,需要執行rm data/registry
刪除緩存數據,強制filebeat從原始數據重新讀取數據。
重點來看Logstash的配置
input {
beats {
port => "5043"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["datetime"]
}
geoip {
source => "clientip"
}
}
output {
elasticsearch {
hosts => "47.89.30.169:9200"
index => "access_log"
}
stdout { codec => rubydebug }
}
本文使用了grok插件,grok是Logstash默認自帶的Filter插件,能夠幫助我們將未結構化的日志數據轉化為結構化、可查詢的數據格式。grok對日志的解析基於特定的正則模式匹配,對於Apache的Access Log 訪問日志,多數情況下我們都適用combined格式。
可以看到現在logstash輸出的內容包括原始日志信息,以及按照日志格式解析后的各字段信息。
GeoIP插件
配置參考上面,使用了GeoIP插件后,可以對訪問IP進行反向解析,返回地址信息。可以用於后續做圖。
但是僅僅這樣還不夠,因為進入ES的數據會自動進行映射,而對於地理數據,需要映射為特殊的geo_point類型,本文未做詳細闡述,后續會有文章專門解決這個問題。
timestamp
logstash默認為每次導入的數據賦予當前的時間做為時間戳,如果我們希望能夠使用日志中的時間做為記錄的時間戳,主要用下面的配置。
date {
match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
target => ["datetime"]
}
這個配置匹配了日志中的時間,放入timestamp時間戳中,並且新創建了一個單獨的datetime字段。
logstash配置完成后,首先確保ElasticSearch處於運行狀態,再啟動 logstash,最后啟動Filebeat。這樣,日志數據就會存放在ES中的 access_log 索引下。
ElasticSearch
ElasticSearch基本上無需做配置,安裝可以參考我之前的文章ElasticSearch + Logstash + Kibana 搭建筆記,這里補充幾個常用的API。
列出可用的索引
curl 'localhost:9200/_cat/indices?v'
結果如下圖
查詢索引數據
$DATE需要替換成具體的日期(格式YYYY.MM.DD),本文就是logstash-2017.08.10。
curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=response=200’
Kibana
首先在Kibana中創建Index Pattern,索引選擇 access_log ,時間戳選擇 timestamp 或者 datetime,然后在 Discover 中就可以看到數據了。
結合Visualize和Dashboar,可以做出按時間統計的訪問曲線和返回狀態餅圖。
參考資料:
1、Logstash Reference
2、Apache mod_log_config
3、Logstash: modify apache date format
4、Elastic Output Plugin