ELK 由 ElasticSearch 、 Logstash 和 Kiabana 三個開源工具組成。官方網站: https://www.elastic.co/productsphp
Elasticsearch 是個開源分佈式搜索引擎,它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制, restful 風格接口,多數據源,自動搜索負載等。 Logstash 是一個徹底開源的工具,他能夠對你的日誌進行收集、分析,並將其存儲供之後使用。 kibana 也是一個開源和免費的工具,他 Kibana 能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助您彙總、分析和搜索重要數據日誌。
elk工做流程:
數據--[輸入數據]-->Logstash--[過濾輸出數據]-->Elasticsearch--[展現分析數據]-->kibananginx
這裏主要說下Logstash的配置(其餘安裝配置都比較簡單,且文檔豐富)常規日誌格式
一、 首先是配置Nginx訪問日誌的格式,根據日誌分析需求配置web
log_format access '$http_host $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" ' '$request_time $upstream_response_time ' '"$http_x_forwarded_for"';
二、 Logstash,它主要是鏈接數據和es的管道,一切數據源,過濾,輸出地址均在logstash配置文件中進行配置,寫配置文件的時候須要根據elk的版本號對應配置,好比我在配置過程當中filter中沒有type設置項,執行時就會有報錯,能夠根據報錯信息進行對應修改json
input { file { path => "/Users/User/log/access.log" type => "web_nginx_access" } } filter { if [type] == "web_nginx_access" { grok { match => [ "message", "%{IPORHOST:http_host} %{IPORHOST:user_ip} - - \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion:float})?|%{DATA:rawrequest})\" %{NUMBER:response:int} (?:%{NUMBER:bytes:int}|-) %{QS:referrer} %{QS:useragent} (?:%{NUMBER:request_time:float}|-) (?:%{NUMBER:upstream_time:float}|-)" ] } } geoip { source => "user_ip" } if [type] == "web_nginx_access" { date { match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ] } } useragent { target => "ua" source => "useragent" } } output { elasticsearch { hosts => "127.0.0.1" index => "logstash-web_nginx_access-%{+YYYY.MM.dd}" } }
Json日誌格式
一、nginx配置使用json格式,logstash的配置會很是簡單
二、logstash配置數組
input { file { path => "/Users/User/log/access.log" type => "web_nginx_access" start_position => beginning codec => "json" } } filter { } output { elasticsearch { hosts => "127.0.0.1" index => "logstash-web_nginx_access-%{+YYYY.MM.dd}" } }
自定義格式
一、例如程序記錄的日誌格式是這樣的:[NOTICE] [2017-04-05 12:00:00] [404] [/index.php] [500] [id=123&btime=2017&etime=2018] [路徑不存在]
;就能夠在logstash自定義正則匹配,重命名字段
二、logstash配置restful
input { file { path => ["/opt/logs/applog/applog_*.log", "***.log"] #日誌路徑,能夠是數組形式 start_position => beginning #從日誌開始位置導入數據 sincedb_path => "/etc/logstash/conf.d/sincedb" #存儲導入進度,刪除後會從新導入全部數據 } } filter { grok { match => { "message" => "(?<log_level>\[(.*?)\])\s*(?<log_time>\[(.*?)\])\s*(?<log_errorid>\[(.*?)\])\s*(?<log_uri>\[(.*?)\])\s*(?<log_runtime>\[(.*?)\])\s*(?<log_query>\[(.*?)\])\s*(?<log_desc>\[(.*?)\])\s*"} #匹配規則,match能夠是多個,自動匹配合適的規則表達式 } } output { elasticsearch { hosts => "127.0.0.1:9200" index => "logstash-%{+YYYY.MM.dd}" #生成es文件名稱 } }