ELK學(xué)習(xí)筆記

由于我們使用的服務(wù)器比較多耸弄,最近每次查看日志都是ssh登陸或者通過(guò)Fabric下載下來(lái)咧虎,特別不方便。經(jīng)過(guò)多方比較计呈,最終選擇了ELK砰诵。所以,開始了學(xué)習(xí)ELK的路程捌显。

本來(lái)茁彭,是打算寫一篇完整教程,后來(lái)想了想扶歪,發(fā)現(xiàn)完整教程中的一些內(nèi)容并不適合展現(xiàn)出來(lái)理肺。但,在學(xué)習(xí)過(guò)程中的內(nèi)容击罪,感覺還是需要做個(gè)筆記哲嘲。所以,暫時(shí)整一篇筆記媳禁,記錄在學(xué)習(xí)實(shí)踐過(guò)程中所有知識(shí)點(diǎn)眠副,后面在將整個(gè)日志系統(tǒng)搭建好整一篇完整的搭建教程】⒒回到正題囱怕,咱們開始學(xué)習(xí)ELK霍弹。

一、簡(jiǎn)單介紹ELK

ELK是Elasticsearch娃弓、Logstash典格、Kibana三個(gè)開源軟件的首字母縮寫,在搭建ELK日志系統(tǒng)時(shí)台丛,除了前面三個(gè)耍缴,還有用到了Filebeat,其中它們的功能作用如下:

  • Elasticsearch:是一個(gè)搜索和分析引擎
  • Logstash:是一個(gè)服務(wù)端的數(shù)據(jù)預(yù)處理管道挽霉,它可以同時(shí)收集防嗡、轉(zhuǎn)換多個(gè)數(shù)據(jù)源的數(shù)據(jù),并且發(fā)送給Elasticsearch
  • Kibana:是一個(gè)Web平臺(tái)侠坎,將Elasticsearch的數(shù)據(jù)用表格和圖片的形式展現(xiàn)出來(lái)蚁趁,以供分析
  • Filebeat: 是一個(gè)日志文件托運(yùn)工具,在服務(wù)器上安裝之后实胸,F(xiàn)ilebeat會(huì)監(jiān)控日志目錄或者指定的日志文件他嫡,追蹤讀取這些文件,將收集到的日志數(shù)據(jù)發(fā)送給Logstash庐完。(除了Logstash钢属,它也可以發(fā)送給Elasticsearch、Kafka假褪、Redis等)

二署咽、ELK架構(gòu)

ELK架構(gòu)分成兩種,一種是經(jīng)典的ELK生音,另外一種是加上消息隊(duì)列(Redis或Kafka或RabbitMQ)和Nginx的架構(gòu)。

經(jīng)典的ELK

經(jīng)典的ELK主要是由Filebeat + Logstash + Elasticsearch + Kibana組成窒升,如下圖:


image.png

它主要適用于數(shù)據(jù)量小的開發(fā)環(huán)境缀遍,存在丟失數(shù)據(jù)的危險(xiǎn)。

消息隊(duì)列+Nginx架構(gòu)

這種架構(gòu)饱须,主要加上了Redis或Kafka或RabbitMQ做消息隊(duì)列域醇,保證了消息的不丟失。而加上Nginx蓉媳,則是可以增加一層訪問(wèn)限制(因?yàn)镵ibana本身沒(méi)有限制譬挚,所以放在Nginx做),如下圖:


image.png

此種架構(gòu)酪呻,主要用在生成環(huán)境减宣,可以處理大數(shù)據(jù)量,并且不會(huì)丟失數(shù)據(jù)玩荠。

三漆腌、安裝ELK

安裝Java 8

由于Elasticsearch贼邓、Logstash是基于Java 8開發(fā)的,所以需要在安裝Elasticsearch闷尿、Logstash的服務(wù)器上安裝Java 8塑径。

$ apt-get update
$ apt-get install default-jre
$ java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

APT安裝ELK源

我這里使用APT安裝的,所以需要先更新ELK源填具,然后就可以apt-get install安裝ELK了统舀。需要注意的是,若是你的LogstashFilebeat在不同的服務(wù)器上劳景,則ELK源需要在每臺(tái)服務(wù)器上安裝一遍誉简。當(dāng)然,若是你習(xí)慣另外方式枢泰,可以參考官網(wǎng)Installation進(jìn)行選擇描融。

首先,下載和安裝公鑰

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

然后衡蚂,安裝apt-transport-https

sudo apt-get install apt-transport-https

之后窿克,將ELK的安裝包源保存到/etc/apt/sources.list.d/elastic-6.x.list

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

最后,更新下apt

sudo apt-get update

安裝Elasticsearch

我們上面已經(jīng)安裝過(guò)了ELK源毛甲,所以可以直接使用apt-get install來(lái)安裝ELK這些軟件年叮。

1、安裝Elasticsearch

sudo apt-get install elasticsearch

2玻募、啟動(dòng)elasticsearch只损,并驗(yàn)證是否運(yùn)行

啟動(dòng)elasticsearch

service elasticsearch start

等一會(huì)兒,然后輸入curl http://localhost:9200進(jìn)行驗(yàn)證

返回下面內(nèi)容七咧,則說(shuō)明運(yùn)行成功:

{
  "name" : "qE-LiYD",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "pbVqoWBjR4ybbPXprKr5WQ",
  "version" : {
    "number" : "6.2.4",
    "build_hash" : "ccec39f",
    "build_date" : "2018-04-12T20:37:28.497551Z",
    "build_snapshot" : false,
    "lucene_version" : "7.2.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

遇到問(wèn)題:剛搭建時(shí)跃惫,我在多臺(tái)服務(wù)器上實(shí)驗(yàn)過(guò),輸入curl http://localhost:9200獲取不到任何內(nèi)容艾栋,啟動(dòng)也沒(méi)有報(bào)錯(cuò)信息爆存。后來(lái),在官方的Install Elasticsearch with Debian Package文檔中蝗砾,查看日志路徑先较,通過(guò)日志才發(fā)現(xiàn)是內(nèi)存不足。最后悼粮,換到一臺(tái)4G內(nèi)存的服務(wù)器上闲勺,就沒(méi)有問(wèn)題了。也可以通過(guò)/usr/share/elasticsearch/bin/elasticsearch命令啟動(dòng)扣猫,當(dāng)報(bào)錯(cuò)時(shí)菜循,能在終端顯示錯(cuò)誤信息

如果要停止或重啟elasticsearch苞笨,可以使用下面命令:

# 停止
service elasticsearch stop
# 重啟
service elasticsearch restart

安裝Logstash

已經(jīng)安裝好ELK源债朵,所以只需要一句命令安裝:

sudo apt-get install logstash

安裝Kibana

Kibana是JS寫的子眶,若是Kibana和Logstash、Elasticsearch在不同服務(wù)器上序芦,可以不安裝Java 8臭杰。

# 安裝Kibana
sudo apt-get install kibana

Kibana的配置文件在/etc/kibana/kibana.yml中,它默認(rèn)打開的端口是5601谚中,并默認(rèn)接收本地9200的elasticsearch數(shù)據(jù)渴杆。對(duì)應(yīng)的配置如下:

server.port: 5601
elasticsearch.url:  "[http://localhost:9200](http://localhost:9200/)"

啟動(dòng)Kibana,使用如下命令:

sudo service kibana start

此時(shí)宪塔,若是將Kibana安裝本地磁奖,就可以通過(guò) http://localhost:5601看到如下頁(yè)面:

image.png

安裝Filebeat

首先安裝好ELK源,然后執(zhí)行下面命令安裝Filebeat

sudo apt-get install filebeat

四某筐、配置

在上面安裝比搭,ElasticsearchKibana使用默認(rèn)配置,重點(diǎn)的配置主要是Filebeat南誊、Logstash身诺。

Filebeat

Filebeat主要是追蹤日志數(shù)據(jù),然后將數(shù)據(jù)傳輸給Logstash或Redis(我這里選擇Redis做消息隊(duì)列)抄囚。

首先霉赡,需要配置追蹤和上傳的日志文件路徑,如下:

filebeat.prospectors:
- type: log
  # 需要將開關(guān)打開
  enabled: true
  paths:
    # 追蹤獲取/root/test.log中的內(nèi)容
    - /root/test.log

當(dāng)將日志數(shù)據(jù)發(fā)送給Logstash時(shí)幔托,如下設(shè)置:

output.logstash:
  # 設(shè)置Logstash的hosts穴亏,若是有多個(gè),可以設(shè)置多個(gè)
  hosts: ["localhost:5044"]

當(dāng)將日志數(shù)據(jù)發(fā)送給Redis時(shí)重挑,如下設(shè)置:

output.redis:
  hosts: ["172.25.19.34:6379"] # host嗓化,主要需要帶上端口號(hào)
  key: "test_log" #存儲(chǔ)在Redis中的隊(duì)列key,可以通過(guò)登錄Redis查看數(shù)據(jù)
  password: "123456" # Redis的密碼
  db: 0 # Redis的數(shù)據(jù)庫(kù)
  timeout: 5 # Redis的超時(shí)時(shí)間

注意:當(dāng)Filebeat輸出到redis時(shí)谬哀,可以登錄數(shù)據(jù)蟆湖,通過(guò)llen查看日志條數(shù)或通過(guò)lrange查看日志具體數(shù)據(jù)。

啟動(dòng)Filebeat玻粪,使用如下命令:

/usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"

當(dāng)如果已經(jīng)追蹤過(guò)了,還想重新測(cè)試诬垂,可以刪除以前的追蹤記錄劲室,命令如下:

rm /usr/share/filebeat/bin/data/registry

Logstash

Logstash主要是收集多個(gè)數(shù)據(jù)源的數(shù)據(jù),然后預(yù)處理一下结窘,最后丟給Elasticsearch做分析很洋。整個(gè)過(guò)程,Logstash就像一個(gè)管道一樣隧枫,如下圖:


image.png

其中喉磁,在Logstash中包括三部分內(nèi)容:

  • inputs: 輸入
  • filters: 過(guò)濾
  • outputs: 輸出

上面三部分內(nèi)容谓苟,也是我們需要進(jìn)行配置的。

首先协怒,我們來(lái)體驗(yàn)一下最簡(jiǎn)單的配置涝焙,也就是標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出。

配置在first.conf文件內(nèi)孕暇,配置內(nèi)容如下:

input {
        stdin {}
}
output {
        stdout {}
}

運(yùn)行配置文件仑撞,命令如下:

/usr/share/logstash/bin/logstash -f first.conf 

輸入test,然后輸出了一個(gè)json格式數(shù)據(jù)妖滔,結(jié)果如下:

[INFO ] 2018-06-04 01:25:36.217 [Ruby-0-Thread-1: /usr/share/logstash/vendor/bundle/jruby/2.3.0/gems/stud-0.0.23/lib/stud/task.rb:22] agent - Pipelines running {:count=>1, :pipelines=>["main"]}
test
{
      "@version" => "1",
    "@timestamp" => 2018-06-03T17:25:51.126Z,
          "host" => "0.0.0.0",
       "message" => "test"
}

然后隧哮,我們讓Logstash接收Filebeat直接傳送過(guò)來(lái)的數(shù)據(jù)

Filebeat中的配置如下:

filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /root/test.log
output.logstash:
  hosts: ["localhost:5044"]

啟動(dòng)filebeat

/usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"

配置在first-pipeline.conf文件中,主要監(jiān)聽5044端口的數(shù)據(jù)座舍,配置內(nèi)容如下:

input {
        beats {
                # 監(jiān)聽5044
                port => "5044"
        }
}
output {
        stdout {}
}

測(cè)試logstash的配置文件沮翔,然后啟動(dòng)logstash

# 測(cè)試
/usr/share/logstash/bin/logstash -f first-pipeline.conf --config.test_and_exit
# 啟動(dòng),當(dāng)配置修改時(shí)曲秉,會(huì)自動(dòng)刷新采蚀,不用重新啟動(dòng)
/usr/share/logstash/bin/logstash -f first-pipeline.conf --config.reload.automatic

此時(shí),F(xiàn)ilebeat中獲取的日志文件岸浑,會(huì)傳送到Logstash顯示在終端搏存。注意,防止看不到效果矢洲,先啟動(dòng)Logstash璧眠,然后啟動(dòng)Filebeat。

最后读虏,我們?cè)倏纯词褂肦edis時(shí)责静,是如何存取數(shù)據(jù)的

在Filebeat端,配置如下:

filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /root/test.log
output.redis:
  hosts: ["172.25.19.34:6379"] # host盖桥,主要需要帶上端口號(hào)
  key: "test_log" #存儲(chǔ)在Redis中的隊(duì)列key灾螃,可以通過(guò)登錄Redis查看數(shù)據(jù)
  password: "123456" # Redis的密碼
  db: 0 # Redis的數(shù)據(jù)庫(kù)
  timeout: 5 # Redis的超時(shí)時(shí)間

啟動(dòng)Filebeat

/usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"

在Logstash端,配置如下:

input {
        redis {
                port => "6379"
                host => "172.25.19.34"
                data_type => "list" # 數(shù)據(jù)類型為隊(duì)列
                type => "log"
                key => "test_log" # 存儲(chǔ)Redis的key
                password => "123456"
                db => 0
                timeout => 5
        }
}
output {
        stdout {
                codec => rubydebug
        }
}

這樣就能夠使用Filebeat將數(shù)據(jù)存入Redis揩徊,而另外一端Logstash從Redis中獲取數(shù)據(jù)腰鬼。

將數(shù)據(jù)輸出到Elasticsearch
前面,我們只是將數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出來(lái)顯示數(shù)據(jù)塑荒,生產(chǎn)環(huán)境中我們需要把數(shù)據(jù)輸出到Elasticsearch熄赡,配置如下:

output {
        elasticsearch {
                # localhost對(duì)應(yīng)安裝elasticsearch的服務(wù)器
                hosts => ["localhost:9200"]
        }
}

還有,Logstash過(guò)濾器
前面齿税,我們用到了Logstash的input和output彼硫,并沒(méi)有用到filter(過(guò)濾器)。過(guò)濾器中,會(huì)用到許多插件拧篮,暫時(shí)我就用過(guò)grok词渤,配置如下:

filter {
        grok {
                match => {"message" => "%{IP:client_ip} %{WORD:method} %{URIPATHPARAM:request} %{GREEDYDATA:content}"}
        }
}

當(dāng)在Logstash中加入上面filter配置時(shí),它就會(huì)進(jìn)行匹配串绩,上面匹配的是: ip 方法 請(qǐng)求參數(shù) 請(qǐng)求內(nèi)容缺虐。
例如:

55.3.244.1 GET /index.html 測(cè)試11
test GET /index.html 測(cè)試22

第一句能匹配,第二句就不能匹配赏参。

上面配置文件中的IP志笼、WORDURIPATHPARAM把篓、GREEDYDATA是內(nèi)置支持的正則表達(dá)式別名纫溃,具體支持的正則表達(dá)式可查看logstash-patterns-core

而若是匹配之后韧掩,就會(huì)在輸出內(nèi)容紊浩,添加client_ipmethod疗锐、requestcontent坊谁。等于就是通過(guò)正則表達(dá)式非結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)化成結(jié)構(gòu)化數(shù)據(jù)

上面兩句話滑臊,被Filebeat抓取之后口芍,在Logstash的終端展示內(nèi)容:

{
      "@version" => "1",
       "content" => "測(cè)試11",
        "offset" => 36,
       "message" => "55.3.244.1 GET /index.html 測(cè)試11",
          "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
    "@timestamp" => 2018-06-03T18:10:03.376Z,
       "request" => "/index.html",
          "beat" => {
        "hostname" => "iZ0xi4n3ya19j63huy3c78Z",
         "version" => "6.2.4",
            "name" => "test"
    },
        "source" => "/root/elk_conf/test.txt",
    "prospector" => {
        "type" => "log"
    },
          "host" => "iZ0xi4n3ya19j63huy3c78Z",
        "method" => "GET",
     "client_ip" => "55.3.244.1"
}
{
    "@timestamp" => 2018-06-03T18:10:03.376Z,
        "source" => "/root/elk_conf/test.txt",
      "@version" => "1",
          "beat" => {
        "hostname" => "iZ0xi4n3ya19j63huy3c78Z",
         "version" => "6.2.4",
            "name" => "test"
    },
    "prospector" => {
        "type" => "log"
    },
          "host" => "iZ0xi4n3ya19j63huy3c78Z",
        "offset" => 66,
       "message" => "test GET /index.html 測(cè)試22",
          "tags" => [
        [0] "beats_input_codec_plain_applied",
        [1] "_grokparsefailure"
    ]
}

可看到第一句話匹配了,添加了對(duì)應(yīng)的字段雇卷。而第二句話沒(méi)有匹配鬓椭,tags中多了_grokparsefailure

而最終关划,在Kibana上顯示的結(jié)果如下:

image.png

參考

Installing ELK
Logstash安裝搭建(一)
A Filebeat Tutorial: Getting Started
Parsing Logs with Logstash
Filebeat小染,Redis和ELK6.x集中式日志解決方案
logstash-patterns-core

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贮折,隨后出現(xiàn)的幾起案子裤翩,更是在濱河造成了極大的恐慌,老刑警劉巖调榄,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踊赠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡每庆,警方通過(guò)查閱死者的電腦和手機(jī)臼疫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扣孟,“玉大人,你說(shuō)我怎么就攤上這事荣赶》锛郏” “怎么了鸽斟?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)利诺。 經(jīng)常有香客問(wèn)我富蓄,道長(zhǎng),這世上最難降的妖魔是什么慢逾? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任立倍,我火速辦了婚禮,結(jié)果婚禮上侣滩,老公的妹妹穿的比我還像新娘口注。我一直安慰自己,他們只是感情好君珠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布寝志。 她就那樣靜靜地躺著,像睡著了一般策添。 火紅的嫁衣襯著肌膚如雪材部。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天唯竹,我揣著相機(jī)與錄音乐导,去河邊找鬼。 笑死浸颓,一個(gè)胖子當(dāng)著我的面吹牛物臂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猾愿,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鹦聪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蒂秘?” 一聲冷哼從身側(cè)響起泽本,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姻僧,沒(méi)想到半個(gè)月后规丽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撇贺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年赌莺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片松嘶。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡艘狭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巢音,我是刑警寧澤遵倦,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站官撼,受9級(jí)特大地震影響梧躺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜傲绣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一掠哥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秃诵,春花似錦续搀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嗤练,卻和暖如春榛了,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煞抬。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工霜大, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人革答。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓战坤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親残拐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子途茫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容