基于ELK+Filebeat搭建日志中心

原文地址:http://chenzhijun.me/2017/12/12/elasticsearch-logstash-kibana-part/,歡迎大家留言交流

基于ELK+Filebeat搭建日志中心

實驗環(huán)境

  1. ubuntu 16
  2. jdk 1.8
  3. elasticesearch 6.0, kibana 6.0, logstash 6.0, filebeat 6.0

我也在windows10下安裝過,win10下只需要修改filebeat的文件路徑配置就可以了。

概念介紹

elastic提供了非常多的工具,官方稱為Elastic Stack。它提供了一些解決方案。我們用到的就是其中Stack中的部分工具

  1. Elasticsearch

Elasticsearch 是一個分布式、可擴(kuò)展開源全文搜索和分析引擎。它能夠進(jìn)行存儲,并且能以很快的速度(接近實時)來進(jìn)行搜索和分析大量的數(shù)據(jù)。它使用Java編寫,底層基于Apache Lucene。

  1. Logstash

Logstash 是一個開源的,服務(wù)端數(shù)據(jù)處理管道。 它可同時從多個源來搜集數(shù)據(jù),對數(shù)據(jù)進(jìn)行過濾等操作,并且將數(shù)據(jù)傳送到你想要傳送的地方進(jìn)行存儲。

  1. Kibana

Kibana 被設(shè)計成一個和Elasticsearch共同使用的開源分析和可視化平臺,它支持將ES中存儲的數(shù)據(jù)生成多種維度的圖等。

  1. Filebeat

Filebeat 是一個輕量級的日志采集器,用于將源數(shù)據(jù)采集后發(fā)送給Logstash,并且Filebeat使用背壓敏感協(xié)議,以考慮更多的數(shù)據(jù)量。如果Logstash正在忙于處理數(shù)據(jù),則可以讓Filebeat知道減慢讀取速度。還有很多Beat可以提供選擇,有監(jiān)控網(wǎng)絡(luò)的Packbeat,指標(biāo)Metricbeat。各種beat詳情:https://www.elastic.co/cn/products/beats

系統(tǒng)架構(gòu)簡圖如下:

環(huán)境搭建

將ELK和filebeat下載后解壓到一個目錄下,四個產(chǎn)品都是開箱即用的。

Logstash安裝與配置

Logstash的作用主要是用來處理數(shù)據(jù),當(dāng)然它也可以直接從日志文件讀取記錄然后進(jìn)行處理。在Logstash的根目錄,我們需要建立一個新文件logstash.conf:

# 配置logstash輸入源
input {
  beats {
    host => "localhost"
    port => "5043" #注意要和filebeat的輸出端口一致
  }
}

# 配置輸出的地方
output {
  # 控制臺
  stdout { codec => rubydebug }
  # es
  elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}

Filebeat安裝與配置

Filebeat作為日志搜集器,肯定是需要指定輸入源和輸出地,所以我們需要先配置它。在Filebeat的根目錄下我們需要在filebeat.yml中:

# 輸入源
filebeat.prospectors:
- type: log
  paths:
    - /var/log/*.log # 日志文件以log結(jié)尾并且需要放在/var/log目錄下
    # 如果是windows,如下
    # - C:\Users\chen\Desktop\elastic\elkjava\log\*.log
# 輸出地
output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5043"]

Elasticsearch和Kibana安裝與配置

這次演示我們對es和kibana不做特別的配置,就默認(rèn)就好了。

啟動順序

其實沒有特別的順序,我一般的啟動順序是elasticsearch->logsatsh->kibana->filebeat。其實差別都不大,特別注意一個就是,如果你想要測試的話,logstash支持配置自動更新,如果是日志文件更新,想讓filebeat重新再搜索一次,刪除掉filebeat根目錄下data/registry文件。其實類推,如果要刪除其它的軟件(elk)的的數(shù)據(jù),刪掉data目錄,很直接很暴力,但不建議在正式場景直接這樣弄。

啟動es:

./bin/elasticsearch

啟動logstash:

# 測試conf文件是否正確配置
./bin/logstash -f logstash.conf --config.test_and_exit

# 啟動logstash,如果有修改conf會自動加載
./bin/logstash -f logstash.conf --config.reload.automatic

啟動kibana:

./bin/kibana

啟動filebeat:

./filebeat -e -c filebeat.yml -d "publish"

現(xiàn)在在瀏覽器中輸入:http://localhost:5601打開kibana,

看到下面的圖:

點(diǎn)擊create,之后再點(diǎn)擊左側(cè)導(dǎo)航欄Discover:

就能看到值了。

不管怎么樣,一定要動手實驗才知道能不能行。

進(jìn)階實戰(zhàn):收集Java日志

上面搭建的elk是可以用的,但是在實際中我發(fā)現(xiàn)一些需要處理的地方,比如Java的日志文件經(jīng)常將堆棧打印出來,這個時候如果還是按照上面的配置,我們無法正確的顯示在kibana中,因為我們上面實際配置的是按行讀取的。但是堆棧信息應(yīng)該是一條。所以我們需要對日志進(jìn)行一些多行處理。
可以在filebeat中處理,也可以在logstash中處理。
我們今天直接在filebeat中處理,讓logstash只做日志的過濾。

首先準(zhǔn)備一份Java的日志文件,大致的日志文件都會像下面這樣格式:date log-level log-message=》時間 日志級別 日志內(nèi)容,下面是一個拋出空指針的文件(有刪減):

2017-12-06 16:59:38,927 WARN ExceptionHandlerExceptionResolver:391 Failed to invoke @ExceptionHandler method: public com.framework.common.model.ResultData com.elasticsearch.exception.IntegralExceptionHandler.exceptionHandler(java.lang.Exception)
java.lang.NullPointerException
    at com.framework.common.util.SpringUtils.getMessage(SpringUtils.java:152) ~[classes/:?]
    at com.framework.common.util.SpringUtils.getMessage(SpringUtils.java:138) ~[classes/:?]
    at com.framework.common.util.SpringUtils.getMessage(SpringUtils.java:57) ~[classes/:?]
    at com.elasticsearch.exception.IntegralExceptionHandler.exceptionHandler(IntegralExceptionHandler.java:33) ~[classes/:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_121]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_121]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_121]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_121]

在filebeat中主要是將堆棧信息的內(nèi)容合并到一行中,也就是說發(fā)送給logstash的時候?qū)⑾旅娴漠惓6褩.?dāng)作log-message,讓filebeat讀取到堆棧的時候?qū)⒖招修D(zhuǎn)義成字符串然后將這行的信息補(bǔ)充到第一行后面。我們可以使用filebeat的multiline配置,詳情:https://www.elastic.co/guide/en/beats/filebeat/current/multiline-examples.html

filebeat.yml:

filebeat.prospectors:
- type: log
  paths:
    - /var/log/*.log # 日志文件以log結(jié)尾并且需要放在/var/log目錄下
    # 如果是windows,如下
    # - C:\Users\chen\Desktop\elastic\elkjava\log\*.log
  multiline: # 多行處理,正則表示如果前面幾個數(shù)字不是4個數(shù)字開頭,那么就會合并到一行
      pattern: ^\d{4}
      negate: true # 正則是否開啟,默認(rèn)false不開啟
      match: after # 不匹配的正則的行是放在上面一行的前面還是后面

output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5043"]

同樣的這次我們對Java日志做一些信息提煉,也就是使用過濾規(guī)則,將date,log-level,log-message等提取出來:

logstash.conf:

input {
  beats {
    host => "localhost"
    port => "5043"
  }
}
filter {
    grok {
            match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{JAVALOGMESSAGE:msg}" }
        }
}
output {
  stdout { codec => rubydebug }
  elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}

值得注意的就是我們使用filter插件,在其中我們使用了grok(基于正則表達(dá)式)過濾我們的日志內(nèi)容。grok可以將無規(guī)則的日志數(shù)據(jù)通過正則匹配將之轉(zhuǎn)換成有結(jié)構(gòu)的數(shù)據(jù),以此我們能夠根據(jù)相應(yīng)結(jié)構(gòu)進(jìn)行查詢。grok的使用方式是:%{規(guī)則:自定義字段名稱}
grok詳情
Logstash提供了很多grok表達(dá)式,詳情可以看:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

為了效果,我們可以刪除filebeat,es,logstash,kibana等根目錄的data文件,然后按照之前的步驟重啟這些工具,
現(xiàn)在可以在kibana中看到相應(yīng)的結(jié)果了:

先看到我們自定義的字段:

在Discover中過濾字段:

結(jié)果:

目前就告一段落了,最主要的是自己動手時間。接下準(zhǔn)備做的事情是將這些能一個Dockerfile,然后只需要自己配置下filebeat的收集目錄和logstash的過濾規(guī)則,我們就能使用了。
不管怎樣只有自己動手去做了,才會知道有很多坑需要填。我也在google搜了很多資料,本來想在文后加個參考鏈接的,后來發(fā)現(xiàn)太多了。算了,還是不貼鏈接了。總之,謝謝哪些我在網(wǎng)上搜資料給了我靈感,幫我跨過一些坑的人。謝謝。

紙上得來終覺淺,絕知此事要躬行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容