ELK+Filebeat搭建實(shí)時(shí)日志分析平臺
ELK Stack 簡介
ELK 不是一款軟件,而是 Elasticsearch、Logstash 和 Kibana 三種軟件產(chǎn)品的首字母縮寫。這三者都是開源軟件,通常配合使用,而且又先后歸于 Elastic.co 公司名下,所以被簡稱為 ELK Stack。根據(jù) Google Trend 的信息顯示,ELK Stack 已經(jīng)成為目前最流行的集中式日志解決方案。
Elasticsearch:分布式搜索和分析引擎,具有高可伸縮、高可靠和易管理等特點(diǎn)?;?Apache Lucene 構(gòu)建,能對大容量的數(shù)據(jù)進(jìn)行接近實(shí)時(shí)的存儲、搜索和分析操作。通常被用作某些應(yīng)用的基礎(chǔ)搜索引擎,使其具有復(fù)雜的搜索功能;Logstash:數(shù)據(jù)收集引擎。它支持動態(tài)的從各種數(shù)據(jù)源搜集數(shù)據(jù),并對數(shù)據(jù)進(jìn)行過濾、分析、豐富、統(tǒng)一格式等操作,然后存儲到用戶指定的位置;Kibana:數(shù)據(jù)分析和可視化平臺。通常與 Elasticsearch 配合使用,對其中數(shù)據(jù)進(jìn)行搜索、分析和以統(tǒng)計(jì)圖表的方式展示;Filebeat:ELK 協(xié)議棧的新成員,一個(gè)輕量級開源日志文件數(shù)據(jù)搜集器,基于 Logstash-Forwarder 源代碼開發(fā),是對它的替代。在需要采集日志數(shù)據(jù)的 server 上安裝 Filebeat,并指定日志目錄或日志文件后,F(xiàn)ilebeat?
就能讀取數(shù)據(jù),迅速發(fā)送到 Logstash 進(jìn)行解析,亦或直接發(fā)送到 Elasticsearch 進(jìn)行集中式存儲和分析。
ELK 常用架構(gòu)及使用場景 最簡單架構(gòu)
在這種架構(gòu)中,只有一個(gè) Logstash、Elasticsearch 和 Kibana 實(shí)例。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è)架構(gòu),了解 ELK 如何工作。
Logstash 作為日志搜集器
這種架構(gòu)是對上面架構(gòu)的擴(kuò)展,把一個(gè) Logstash 數(shù)據(jù)搜集節(jié)點(diǎn)擴(kuò)展到多個(gè),分布于多臺機(jī)器,將解析好的數(shù)據(jù)發(fā)送到 Elasticsearch server 進(jìn)行存儲,最后在 Kibana 查詢、生成日志報(bào)表等。詳見圖 2。?
圖 2. Logstash 作為日志搜索器?
?
這種結(jié)構(gòu)因?yàn)樾枰诟鱾€(gè)服務(wù)器上部署 Logstash,而它比較消耗 CPU 和內(nèi)存資源,所以比較適合計(jì)算資源豐富的服務(wù)器,否則容易造成服務(wù)器性能下降,甚至可能導(dǎo)致無法正常工作。
Beats 作為日志搜集器
這種架構(gòu)引入 Beats 作為日志搜集器。目前 Beats 包括四種:
Packetbeat(搜集網(wǎng)絡(luò)流量數(shù)據(jù));Topbeat(搜集系統(tǒng)、進(jìn)程和文件系統(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é)點(diǎn)上占用系統(tǒng)資源高的問題。相比 Logstash,Beats 所占系統(tǒng)的 CPU 和內(nèi)存幾乎可以忽略不計(jì)。另外,Beats 和 Logstash 之間支持 SSL/TLS 加密傳輸,客戶端和服務(wù)器雙向認(rèn)證,保證了通信安全。?
因此這種架構(gòu)適合對數(shù)據(jù)安全性要求較高,同時(shí)各服務(wù)器性能比較敏感的場景。
引入消息隊(duì)列機(jī)制的架構(gòu)
這種架構(gòu)使用 Logstash 從各個(gè)數(shù)據(jù)源搜集數(shù)據(jù),然后經(jīng)消息隊(duì)列輸出插件輸出到消息隊(duì)列中。目前 Logstash 支持 Kafka、Redis、RabbitMQ 等常見消息隊(duì)列。然后 Logstash 通過消息隊(duì)列輸入插件從隊(duì)列中獲取數(shù)據(jù),分析過濾后經(jīng)輸出插件發(fā)送到 Elasticsearch,最后通過 Kibana 展示。詳見圖 4。
圖 4. 引入消息隊(duì)列機(jī)制的架構(gòu)?
這種架構(gòu)適合于日志規(guī)模比較龐大的情況。但由于 Logstash 日志解析節(jié)點(diǎn)和 Elasticsearch 的負(fù)荷比較重,可將他們配置為集群模式,以分擔(dān)負(fù)荷。引入消息隊(duì)列,均衡了網(wǎng)絡(luò)傳輸,從而降低了網(wǎng)絡(luò)閉塞,尤其是丟失數(shù)據(jù)的可能性,但依然存在 Logstash 占用系統(tǒng)資源過多的問題。
基于 Filebeat 架構(gòu)的配置部署詳解
前面提到 Filebeat 已經(jīng)完全替代了 Logstash-Forwarder 成為新一代的日志采集器,同時(shí)鑒于它輕量、安全等特點(diǎn),越來越多人開始使用它。這個(gè)章節(jié)將詳細(xì)講解如何部署基于 Filebeat 的 ELK 集中式日志解決方案,具體架構(gòu)見圖 5。
圖 5. 基于 Filebeat 的 ELK 集群架構(gòu)?
因?yàn)槊赓M(fèi)的 ELK 沒有任何安全機(jī)制,所以這里使用了 Nginx 作反向代理,避免用戶直接訪問 Kibana 服務(wù)器。加上配置 Nginx 實(shí)現(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)前工作目錄下。所以如果你換一個(gè)工作目錄執(zhí)行 filebeat 會導(dǎo)致重復(fù)傳輸!
? ?config_dir: "path/to/configs/contains/many/yaml" ? ?# 如果配置過長,可以通過目錄加載方式拆分配置
? ?prospectors: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 有相同配置參數(shù)的可以歸類為一個(gè) 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 時(shí)的 _type 值
? ? ? ? ? ?ignore_older: "24h" ? ? ? ? ? ? ? ? ? ? ? ? # 超過 24 小時(shí)沒更新內(nèi)容的文件不再監(jiān)聽。在 windows 上另外有一個(gè)配置叫 force_close_files,只要文件名一變化立刻關(guān)閉文件句柄,保證文件可以被刪除,缺陷是可能會有日志還沒讀完
? ? ? ? ? ?scan_frequency: "10s" ? ? ? ? ? ? ? ? ? ? ? # 每 10 秒鐘掃描一次目錄,更新通配符匹配上的文件列表
? ? ? ? ? ?tail_files: false ? ? ? ? ? ? ? ? ? ? ? ? ? # 是否從文件末尾開始讀取
? ? ? ? ? ?harvester_buffer_size: 16384 ? ? ? ? ? ? ? ?# 實(shí)際讀取文件時(shí),每次讀取 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: after
output:
? ?...
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)計(jì)到api接口調(diào)用排行,瀏覽器類型,操作系統(tǒng)類型,http狀態(tài)分布,響應(yīng)時(shí)間分布。雖然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三個(gè)字段作為之后排序依據(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)時(shí)間
metrics選擇Count第一個(gè)buckets以Terms為聚合,選擇status字段,order by count,Size填5第二個(gè)bucket以Range為子聚合,選擇responsetime字段,from-to指定響應(yīng)時(shí)間范圍,比如0-0.1,0.1-0.2,0.2-0.5,0.5-1,1-2,2-5,5-10
2. 直方圖:http狀態(tài)時(shí)間軸直方圖 metrics選擇Countbuckets X-Axis選擇timestamp_local,時(shí)間間隔可選擇秒,分,小時(shí)等buckets Split Bars選擇Terms為子聚合,選擇status字段,order by term(相當(dāng)于對status進(jìn)行g(shù)roup分組)
3. 線形圖:所有接口調(diào)用數(shù)時(shí)間曲線圖 metrics選擇Countbuckets X-Axis選擇Data Histogram(時(shí)間片),選擇timestamp_local字段,時(shí)間間隔可選擇秒,分,小時(shí)等。
4. 聚合數(shù)字:接口調(diào)用總數(shù) metric 可視化為你選擇的聚合顯示一個(gè)單獨(dú)的數(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ū)塊圖來可視化多個(gè)不同序列的總體貢獻(xiàn)。 Data table 用數(shù)據(jù)表來顯示聚合的原始數(shù)據(jù)。其他可視化可以通過點(diǎn)擊底部的方式顯示數(shù)據(jù)表。 Line chart 用折線圖來比較不同序列。 Markdown widget 用Markdown顯示自定義格式的信息或和你儀表盤有關(guān)的用法說明。 Metric 用指標(biāo)可視化在你儀表盤上顯示單個(gè)數(shù)字。 Pie chart 用餅圖來顯示每個(gè)來源對總體的貢獻(xiàn)。 Tile map 用瓦片地圖將聚合結(jié)果和經(jīng)緯度聯(lián)系起來。 Timeseries 計(jì)算和展示多個(gè)時(shí)間序列數(shù)據(jù)。 Vertical bar chart 用垂直條形圖作為一個(gè)通用圖形。 metrics聚合 <blockquote class="white-blockquote" style="border-left:10px solid rgb(214,219,223);border-top-color:rgb(214,219,223);border-right-color: