ELK+Filebeat搭建實時日志分析平臺
ELK Stack 簡介
ELK 不是一款軟件,而是 Elasticsearch、Logstash 和 Kibana 三種軟件產(chǎn)品的首字母縮寫。這三者都是開源軟件,通常配合使用,而且又先后歸于 Elastic.co 公司名下,所以被簡稱為 ELK Stack。根據(jù) Google Trend 的信息顯示,ELK Stack 已經(jīng)成為目前最流行的集中式日志解決方案。
Elasticsearch:分布式搜索和分析引擎,具有高可伸縮、高可靠和易管理等特點。基于 Apache Lucene 構(gòu)建,能對大容量的數(shù)據(jù)進行接近實時的存儲、搜索和分析操作。通常被用作某些應(yīng)用的基礎(chǔ)搜索引擎,使其具有復(fù)雜的搜索功能;Logstash:數(shù)據(jù)收集引擎。它支持動態(tài)的從各種數(shù)據(jù)源搜集數(shù)據(jù),并對數(shù)據(jù)進行過濾、分析、豐富、統(tǒng)一格式等操作,然后存儲到用戶指定的位置;Kibana:數(shù)據(jù)分析和可視化平臺。通常與 Elasticsearch 配合使用,對其中數(shù)據(jù)進行搜索、分析和以統(tǒng)計圖表的方式展示;Filebeat:ELK 協(xié)議棧的新成員,一個輕量級開源日志文件數(shù)據(jù)搜集器,基于 Logstash-Forwarder 源代碼開發(fā),是對它的替代。在需要采集日志數(shù)據(jù)的 server 上安裝 Filebeat,并指定日志目錄或日志文件后,F(xiàn)ilebeat?
就能讀取數(shù)據(jù),迅速發(fā)送到 Logstash 進行解析,亦或直接發(fā)送到 Elasticsearch 進行集中式存儲和分析。
ELK 常用架構(gòu)及使用場景 最簡單架構(gòu)
在這種架構(gòu)中,只有一個 Logstash、Elasticsearch 和 Kibana 實例。Logstash 通過輸入插件從多種數(shù)據(jù)源(比如日志文件、標(biāo)準(zhǔn)輸入 Stdin 等)獲取數(shù)據(jù),再經(jīng)過濾插件加工數(shù)據(jù),然后經(jīng) Elasticsearch 輸出插件輸出到 Elasticsearch,通過 Kibana 展示。詳見圖 1。?
圖 1. 最簡單架構(gòu)?
?
這種架構(gòu)非常簡單,使用場景也有限。初學(xué)者可以搭建這個架構(gòu),了解 ELK 如何工作。
Logstash 作為日志搜集器
這種架構(gòu)是對上面架構(gòu)的擴展,把一個 Logstash 數(shù)據(jù)搜集節(jié)點擴展到多個,分布于多臺機器,將解析好的數(shù)據(jù)發(fā)送到 Elasticsearch server 進行存儲,最后在 Kibana 查詢、生成日志報表等。詳見圖 2。?
圖 2. Logstash 作為日志搜索器?
?
這種結(jié)構(gòu)因為需要在各個服務(wù)器上部署 Logstash,而它比較消耗 CPU 和內(nèi)存資源,所以比較適合計算資源豐富的服務(wù)器,否則容易造成服務(wù)器性能下降,甚至可能導(dǎo)致無法正常工作。
Beats 作為日志搜集器
這種架構(gòu)引入 Beats 作為日志搜集器。目前 Beats 包括四種:
Packetbeat(搜集網(wǎng)絡(luò)流量數(shù)據(jù));Topbeat(搜集系統(tǒng)、進程和文件系統(tǒng)級別的 CPU 和內(nèi)存使用情況等數(shù)據(jù));Filebeat(搜集文件數(shù)據(jù));Winlogbeat(搜集 Windows 事件日志數(shù)據(jù))。
Beats 將搜集到的數(shù)據(jù)發(fā)送到 Logstash,經(jīng) Logstash 解析、過濾后,將其發(fā)送到 Elasticsearch 存儲,并由 Kibana 呈現(xiàn)給用戶。詳見圖 3。
圖 3. Beats 作為日志搜集器?
這種架構(gòu)解決了 Logstash 在各服務(wù)器節(jié)點上占用系統(tǒng)資源高的問題。相比 Logstash,Beats 所占系統(tǒng)的 CPU 和內(nèi)存幾乎可以忽略不計。另外,Beats 和 Logstash 之間支持 SSL/TLS 加密傳輸,客戶端和服務(wù)器雙向認(rèn)證,保證了通信安全。?
因此這種架構(gòu)適合對數(shù)據(jù)安全性要求較高,同時各服務(wù)器性能比較敏感的場景。
引入消息隊列機制的架構(gòu)
這種架構(gòu)使用 Logstash 從各個數(shù)據(jù)源搜集數(shù)據(jù),然后經(jīng)消息隊列輸出插件輸出到消息隊列中。目前 Logstash 支持 Kafka、Redis、RabbitMQ 等常見消息隊列。然后 Logstash 通過消息隊列輸入插件從隊列中獲取數(shù)據(jù),分析過濾后經(jīng)輸出插件發(fā)送到 Elasticsearch,最后通過 Kibana 展示。詳見圖 4。
圖 4. 引入消息隊列機制的架構(gòu)?
這種架構(gòu)適合于日志規(guī)模比較龐大的情況。但由于 Logstash 日志解析節(jié)點和 Elasticsearch 的負(fù)荷比較重,可將他們配置為集群模式,以分擔(dān)負(fù)荷。引入消息隊列,均衡了網(wǎng)絡(luò)傳輸,從而降低了網(wǎng)絡(luò)閉塞,尤其是丟失數(shù)據(jù)的可能性,但依然存在 Logstash 占用系統(tǒng)資源過多的問題。
基于 Filebeat 架構(gòu)的配置部署詳解
前面提到 Filebeat 已經(jīng)完全替代了 Logstash-Forwarder 成為新一代的日志采集器,同時鑒于它輕量、安全等特點,越來越多人開始使用它。這個章節(jié)將詳細(xì)講解如何部署基于 Filebeat 的 ELK 集中式日志解決方案,具體架構(gòu)見圖 5。
圖 5. 基于 Filebeat 的 ELK 集群架構(gòu)?
因為免費的 ELK 沒有任何安全機制,所以這里使用了 Nginx 作反向代理,避免用戶直接訪問 Kibana 服務(wù)器。加上配置 Nginx 實現(xiàn)簡單的用戶認(rèn)證,一定程度上提高安全性。另外,Nginx 本身具有負(fù)載均衡的作用,能夠提高系統(tǒng)訪問性能。
Filebeat安裝 下載地址:https://www.elastic.co/downloads/beats/filebeat編輯filebeat.yml啟動sudo ./filebeat -e -c filebeat.ymlfilebeat input配置介紹
filebeat: ? ?spool_size: 1024 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 最大可以攢夠 1024 條數(shù)據(jù)一起發(fā)送出去 ? ?idle_timeout: "5s" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 否則每 5 秒鐘也得發(fā)送一次 ? ?registry_file: ".filebeat" ? ? ? ? ? ? ? ? ? ? ? ? ?# 文件讀取位置記錄文件,會放在當(dāng)前工作目錄下。所以如果你換一個工作目錄執(zhí)行 filebeat 會導(dǎo)致重復(fù)傳輸! ? ?config_dir: "path/to/configs/contains/many/yaml" ? ?# 如果配置過長,可以通過目錄加載方式拆分配置 ? ?prospectors: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 有相同配置參數(shù)的可以歸類為一個 prospector ? ? ? ?- ? ? ? ? ? ?fields: ? ? ? ? ? ? ? ?ownfield: "mac" ? ? ? ? ? ? ? ? ? ? ? ? # 類似 logstash 的 add_fields ? ? ? ? ? ?paths: ? ? ? ? ? ? ? ?- /var/log/system.log ? ? ? ? ? ? ? ? ? # 指明讀取文件的位置 ? ? ? ? ? ? ? ?- /var/log/wifi.log ? ? ? ? ? ?include_lines: ["^ERR", "^WARN"] ? ? ? ? ? ?# 只發(fā)送包含這些字樣的日志 ? ? ? ? ? ?exclude_lines: ["^OK"] ? ? ? ? ? ? ? ? ? ? ?# 不發(fā)送包含這些字樣的日志 ? ? ? ?- ? ? ? ? ? ?document_type: "apache" ? ? ? ? ? ? ? ? ? ? # 定義寫入 ES 時的 _type 值 ? ? ? ? ? ?ignore_older: "24h" ? ? ? ? ? ? ? ? ? ? ? ? # 超過 24 小時沒更新內(nèi)容的文件不再監(jiān)聽。在 windows 上另外有一個配置叫 force_close_files,只要文件名一變化立刻關(guān)閉文件句柄,保證文件可以被刪除,缺陷是可能會有日志還沒讀完 ? ? ? ? ? ?scan_frequency: "10s" ? ? ? ? ? ? ? ? ? ? ? # 每 10 秒鐘掃描一次目錄,更新通配符匹配上的文件列表 ? ? ? ? ? ?tail_files: false ? ? ? ? ? ? ? ? ? ? ? ? ? # 是否從文件末尾開始讀取 ? ? ? ? ? ?harvester_buffer_size: 16384 ? ? ? ? ? ? ? ?# 實際讀取文件時,每次讀取 16384 字節(jié) ? ? ? ? ? ?backoff: "1s" ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 每 1 秒檢測一次文件是否有新的一行內(nèi)容需要讀取 ? ? ? ? ? ?paths: ? ? ? ? ? ? ? ?- "/var/log/apache/*" ? ? ? ? ? ? ? ? ? # 可以使用通配符 ? ? ? ? ? ?exclude_files: ["/var/log/apache/error.log"] ? ? ? ?- ? ? ? ? ? ?input_type: "stdin" ? ? ? ? ? ? ? ? ? ? ? ? # 除了 "log",還有 "stdin" ? ? ? ? ? ?multiline: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 多行合并 ? ? ? ? ? ? ? ?pattern: '^[[:space:]]' ? ? ? ? ? ? ? ?negate: false ? ? ? ? ? ? ? ?match: afteroutput: ? ?...Elasticsearch安裝
下載地址:https://www.elastic.co/downloads/elasticsearch
Logstash安裝
下載地址:https://www.elastic.co/downloads/logstash
Kibana安裝
下載地址:https://www.elastic.co/downloads/kibana
Kibana視圖構(gòu)建示例及配置 以收集Nginx訪問日志為例,我們希望能統(tǒng)計到api接口調(diào)用排行,瀏覽器類型,操作系統(tǒng)類型,http狀態(tài)分布,響應(yīng)時間分布。雖然logstash可以通過內(nèi)建模板解析Nginx日志字符串,不過直接在Nginx配置中直接json字符串最為方便。 編輯/usr/local/nginx/conf/nginx.conf
在server節(jié)定義json日志格式
log_format json '{"@timestamp_local":"$time_iso8601",' ? ?'"host":"$server_addr",' ? ?'"clientip":"$remote_addr",' ? ?'"size":$body_bytes_sent,' ? ?'"responsetime":$request_time,' ? ?'"upstreamtime":"$upstream_response_time",' ? ?'"upstreamhost":"$upstream_addr",' ? ?'"http_host":"$host",' ? ?'"url":"$uri",' ? ?'"type":"newnginx-api",' ? ?'"request":"$request",' ? ?'"time_local":"$time_local",' ? ?'"xff":"$http_x_forwarded_for",' ? ?'"referer":"$http_referer",' ? ?'"agent":"$http_user_agent",' ? ?'"status":"$status"}';
然后在各網(wǎng)站Nginx配置下指定json模板日志格式
access_log ?/home/wwwlogs/abc.com.log json;
重啟Nginx,日志格式輸出結(jié)果示例如下:
{"@timestamp_local":"2017-02-23T16:16:19+08:00","host":"192.168.56.10","clientip":"192.168.56.1","size":5,"responsetime":0.085,"upstreamtime":"0.085","upstreamhost":"unix:/tmp/php-cgi.sock","http_host":"www.abc.com","url":"/index.php","type":"newnginx-api","request":"GET / HTTP/1.1","time_local":"23/Feb/2017:16:16:19 +0800","xff":"-","referer":"-","agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36","status":"500"}編輯filebeat.yml
增加或更新以下配置
filebeat.registry_file: ".filebeat"filebeat.prospectors:- input_type: log ? ?paths: ? ? ? ?- /home/wwwlogs/abc.com.log ? ?tail_files: true #從文件末尾開始讀取 ? ?document_type: "newnginx-api"output.logstash: ? ?# The Logstash hosts ? ?hosts: ["localhost:5044"]編輯logstash.yml
input { ? ?beats { ? ? ? ?port => 5044 ? ? ? ?codec => "json" ? ?}}filter { ? ?grok { ? ? ? ?match => { ? ? ? ? ? ?"request" => "s+(? ? ? ? ?} ? ?} ? ?grok { ? ? ? ?match => { ? ? ? ? ? ?"agent" => "(? ? ? ? ?} ? ?} ? ?grok { ? ? ? ?match => { ? ? ? ? ? ?"agent" => "(? ? ? ? ?} ? ?} ? ?mutate { ? ? ? ?split => [ "upstreamtime", "," ] ? ?} ? ?mutate { ? ? ? ?convert => [ "upstreamtime", "float" ] ? ?}}output { ? ?stdout { ? ? ? ?codec => rubydebug ? ?} ? ?elasticsearch { ? ? ? ?hosts => ["localhost:9200"] ? ? ? ?index => "%{type}-%{+YYYY.MM.dd}" ? ? ? ?flush_size => 2000 ? ? ? ?idle_flush_time => 10 ? ? ? ?sniffing => false ? ? ? ?template_overwrite => true ? ?}}
logstash filter主要從日志中提取api_path,os,browser三個字段作為之后排序依據(jù)。
增加Kibana索引index pattern
菜單 -> Management -> Index Patterns -> Add New
我們在filebeat.yml中配置了document_type: "newnginx-api",所以index name pattern寫為newnginx-api-*,*表示所有日期的。見圖:
視圖示例配置
1. 餅圖:HTTP狀態(tài)及響應(yīng)時間
metrics選擇Count第一個buckets以Terms為聚合,選擇status字段,order by count,Size填5第二個bucket以Range為子聚合,選擇responsetime字段,from-to指定響應(yīng)時間范圍,比如0-0.1,0.1-0.2,0.2-0.5,0.5-1,1-2,2-5,5-10
2. 直方圖:http狀態(tài)時間軸直方圖 metrics選擇Countbuckets X-Axis選擇timestamp_local,時間間隔可選擇秒,分,小時等buckets Split Bars選擇Terms為子聚合,選擇status字段,order by term(相當(dāng)于對status進行g(shù)roup分組)
3. 線形圖:所有接口調(diào)用數(shù)時間曲線圖 metrics選擇Countbuckets X-Axis選擇Data Histogram(時間片),選擇timestamp_local字段,時間間隔可選擇秒,分,小時等。
4. 聚合數(shù)字:接口調(diào)用總數(shù) metric 可視化為你選擇的聚合顯示一個單獨的數(shù)字。 5. 直方圖:接口調(diào)用排行榜 metrics選擇Countbuckets X-Axis選擇Terms聚合,選取api_path字段,order by count,size填30(前30調(diào)用最高)buckets Split Bars選擇Terms子聚合,選取api_path字段,order by count
其他視圖配置根據(jù)需要選擇metrics和buckets。
Kibana功能簡要介紹 可視化類型Area chart 用區(qū)塊圖來可視化多個不同序列的總體貢獻。 Data table 用數(shù)據(jù)表來顯示聚合的原始數(shù)據(jù)。其他可視化可以通過點擊底部的方式顯示數(shù)據(jù)表。 Line chart 用折線圖來比較不同序列。 Markdown widget 用Markdown顯示自定義格式的信息或和你儀表盤有關(guān)的用法說明。 Metric 用指標(biāo)可視化在你儀表盤上顯示單個數(shù)字。 Pie chart 用餅圖來顯示每個來源對總體的貢獻。 Tile map 用瓦片地圖將聚合結(jié)果和經(jīng)緯度聯(lián)系起來。 Timeseries 計算和展示多個時間序列數(shù)據(jù)。 Vertical bar chart 用垂直條形圖作為一個通用圖形。 metrics聚合 <blockquote class="white-blockquote" style="border-left:10px solid rgb(214,219,223);border-top-color:rgb(214,219,223);border-right-color:





