Elastic Stack日誌查詢平臺第一篇:快速開始

本文最初發表在我的個人博客,查看原文


本文會帶你瞭解:

  • Elastic Stack 可以幹什麼
  • Elastic Stack 有哪些核心產品
  • 爲什麼要搭建日誌查詢平臺
  • 如何快速搭建一個日誌查詢平臺

Elastic Stack系列文章鏈接:
Elastic Stack日誌查詢平臺第一篇:快速開始
Elastic Stack日誌查詢平臺第二篇:Elasticsearch生產配置


本文是 Elastic Stack 日誌查詢平臺系列的第一篇。後續我會分章節記錄如何在生產環境構建一個日誌查詢平臺。

一 簡介

Elastic Stack 是應對多種搜索場景的一站式解決方案。主要產品包括 Elasticsearch、Kibana、Beats 和 Logstash(也稱爲 ELK Stack)。能夠安全可靠地獲取任何來源、任何格式的數據,然後實時地對數據進行搜索、分析和可視化。其中Beats 平臺集合了多種單一用途數據採集器。它們可以從成百上千或成千上萬臺機器和系統向 Logstash 或 Elasticsearch 發送數據。目前對各個平臺支持的都比較好,主流的OS基本都支持,另外容器環境也是支持的,如Docker/K8S等。

其中 Beats 平臺產品模塊又包括 Filebeat,Metricbeat,Packetbeat,Winlogbeat,Auditbeat,Heartbeat,Functionbeat。

本系列文章主要使用其中的 Filebeat 模塊作爲日誌採集器,因爲 Filebeat 足夠小巧和輕量,非常適合作爲 agent 部署在目標服務器上。老牌的 Logstash(ELK中的“L”)同樣也可以完成日誌採集工作,但在過去的日子裏由於性能和資源佔用問題,現在已經慢慢退出日誌採集工作,主要負責日誌的二次加工處理工作。

本文將選用其中的 Elasticsearch、Kibana、以及 Beats 平臺中的 Filebeat 進行介紹(即EFK)。其中 Elasticsearch 用於日誌的索引及搜索,Kibana用於結果展示,Filebeat 用於日誌採集。

二 環境要求

1. 操作系統:
本系列文章全部在CentOS 7以及Ubuntu Server 18.04上驗證過。

2. JVM:
由於 Elasticsearch 是一個Java應用,所以需要一個Java運行環境,Elasticsearch 自身已經集成了一個JDK(OpenJDK 13)隨發行版一起發佈,推薦使用集成的就好了,如果你仍堅持想使用自己系統上已有的JDK,沒關係,只需要在環境變量中配置一個JAVA_HOME變量即可,需要注意的是Elasticsearch要求JDK最低版本爲8。另外,官方推薦使用長期支持版本(LTS)的發行版,像Java9,10,12這些短期發行版本不推薦使用。

參見詳細平臺支持列表

3. 系統用戶:
部分配置文件對權限要求很嚴格,除非特別說明,本文假設所有操作均使用具有sudo權限的devops用戶。

三 下載安裝

本系列文章所採用的Elastic Stack版本爲7.4.1(7.4.x),如果你也想跟我一起搭建這個平臺,請確保版本一致。

3.1 安裝及啓動順序

務必按以下順序安裝並啓動各個服務:

  1. Elasticsearch
  2. Kibana
  3. Filebeat

3.2 Elasticsearch

Elasticsearch是一個實時的分佈式存儲,搜索和分析引擎。它可以用於多種目的,但它擅長的一種場景是索引半結構化數據流,例如日誌或解碼的網絡數據包。Elasticsearch使用稱爲倒排索引的數據結構,該結構支持非常快速的全文本搜索。

1. 下載

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.4.1-linux-x86_64.tar.gz
tar -zxvf elasticsearch-7.4.1-linux-x86_64.tar.gz
cd elasticsearch-7.4.1

解壓後的目錄elasticsearch-7.4.1我們稱爲$ES_HOME
Elastic Stack產品很多配置選項都提供了默認值,對於初次接觸的用戶很容易上手。

2. 啓動

./bin/elasticsearch

默認情況下,Elasticsearch 運行在前臺,要以後臺進程運行,執行以下命令:

./bin/elasticsearch -d

3. 檢查服務
我們可以使用以下命令測試一下服務是否運行起來:

curl http://127.0.0.1:9200

Elasticsearch 默認監聽92009300端口,請確認端口可用。

正常的話會返回以下內容:

{
  "name" : "devServer1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "7bThQB_TTWOHnQ70Jt6I6g",
  "version" : {
    "number" : "7.4.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "fc0eeb6e2c25915d63d871d344e3d0b45ea0ea1e",
    "build_date" : "2019-10-22T17:16:35.176724Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

4. 結束進程
前臺運行的話,直接按Ctrl+C即可。後臺運行的話,先查找進程ID,再kill掉即可:

ps -ef |grep Elastic

kill -15 pid

3.3 Kibana

Kibana是一個開源的數據可視化平臺,與 Elasticsearch 一起,完成數據的搜索,展示及分析等。
推薦將Kibana與 Elasticsearch 安裝在同一臺服務器上,但這不是必須的,如果你將其安裝在另一臺服務器,請確保修改配置文件中的URL地址。

1. 下載

curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.4.1-linux-x86_64.tar.gz
tar -zxvf kibana-7.4.1-linux-x86_64.tar.gz
cd kibana-7.4.1-linux-x86_64/

2. 啓動
如果你不是在本地運行的,請先修改config/kibana.yml配置文件,找到#server.host: "localhost"一行,將前面的註釋去掉,並將localhost修改爲實際的IP地址,如192.168.0.132

./bin/kibana

Kibana默認監聽5601端口,確保端口可用。

3. 查看
Kibana默認監聽本地5601端口,打開地址http://127.0.0.1:5601查看。如果你不是在本地運行的,修改爲實際的IP地址,如192.168.0.132。:
IMAGE

由於默認沒有啓用鑑權,所以打開後直接就可以進入首頁了。

4. 結束
按Ctrl+C即可。

Kibana默認也是運行在前臺,但是官方並未提供後臺運行的方案,所以只能按照普通的腳本來處理了,我們可以使用以下命令讓其在後臺運行:

mkdir -p logs && \
nohup ./bin/kibana >> logs/kibana.log 2>&1 &

該命令運行成功後會返回進程的ID:

[1] 4370

如果後續找不到該ID,或者忘記了,很簡單,只需要查看一下日誌既可以了,日誌中會記錄下這個pid:

tail -n1 logs/kibana.log

日誌是JSON格式,在結果中找到pid字段對應的值就是Kibana的PID,例如下面的第4個字段:
“pid”:4370

{"type":"log","@timestamp":"2019-11-24T08:38:39Z","tags":["warning","telemetry"],"pid":4370,"message":"Error scheduling task, received [task:oss_telemetry-vis_telemetry]: version conflict, document already exists (current version [3]): [version_conflict_engine_exception] [task:oss_telemetry-vis_telemetry]: version conflict, document already exists (current version [3]), with { index_uuid=\"29HpkrjHTzylpGl7-zR0mA\" & shard=\"0\" & index=\".kibana_task_manager_1\" }"}

找到後kill就可以結束該進程了。

如果你的服務器上沒有node.js應用,還可以使用ps -ef |grep bin/node查找PID。

3.4 Filebeat

Filebeat 是Beats家族中的一員。用於採集各種日誌文件,它足夠小巧,輕量,簡單,可以作爲agent安裝在服務上。Filebeat 內置有多種模塊(auditd、Apache、NGINX、System、MySQL 等等),可針對常見格式的日誌大大簡化收集、解析和可視化過程,只需一條命令即可。

Filebeat 運行的前提是 Elasticsearch 和Kibana已經運行起來。

1. 下載

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.4.1-linux-x86_64.tar.gz
tar -zxvf filebeat-7.4.1-linux-x86_64.tar.gz
cd filebeat-7.4.1-linux-x86_64

2. 準備日誌收集目錄
假設以下目錄是我們的日誌存放的目錄:

sudo mkdir -p /opt/data/my-app1-log && \
sudo chown devops:devops /opt/data/my-app1-log

注意權限,將devops用戶替換爲你實際要運行Filebeat的用戶。

3. 準備一些測試日誌
編輯/opt/data/my-app1-log/app.log並存入以下示例日誌內容:

2019-10-06 11:40:36.652 INFO http-bio-10009-exec-302 - start someMethod for some params
2019-10-06 11:40:36.652 INFO http-bio-10009-exec-302 - getUser for someField null,paramId 1111
2019-10-06 11:40:36.653 DEBUG http-bio-10009-exec-302 - ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@5f324b3c]
2019-10-06 11:40:36.653 DEBUG http-bio-10009-exec-302 - ==>  Preparing: select * from t_user where login_name=?
2019-10-06 11:40:36.653 DEBUG http-bio-10009-exec-302 - ==> Parameters: 18888888888(String)
2019-10-06 11:40:37.254 INFO http-bio-10009-exec-302 - Filtering response of path: /some/controller/path
2019-10-06 11:40:37.254 INFO http-bio-10009-exec-308 - Filtering request of path: /some/controller/path
2019-10-06 11:40:37.254 INFO http-bio-10009-exec-308 - init session with something=<null>,xxxxxxxx,userId=1234
2019-10-06 11:40:37.254 INFO http-bio-10009-exec-308 - start someMethod for some params
2019-10-06 11:40:37.255 INFO http-bio-10009-exec-308 - getUser for someField null,paramId 2222
2019-10-06 11:40:37.255 DEBUG http-bio-10009-exec-308 - ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@5f324b3c]
2019-10-06 11:40:37.255 DEBUG http-bio-10009-exec-308 - ==>  Preparing: select * from t_user where login_name=?
2019-10-06 11:40:37.255 DEBUG http-bio-10009-exec-308 - ==> Parameters: 19999999999(String)
2019-10-06 11:40:37.262 INFO http-bio-10009-exec-171 - Filtering request of path: /some/controller/path
2019-10-06 11:40:37.262 INFO http-bio-10009-exec-171 - init session with something=<null>,xxxxxxxx,userId=1256
2019-10-06 11:40:37.262 INFO http-bio-10009-exec-171 - Filtering response of path: /some/controller/path
2019-10-06 11:40:37.262 INFO http-bio-10009-exec-308 - Filtering response of path: /another/controller/path
2019-10-06 11:40:37.263 INFO http-bio-10009-exec-135 - Filtering request of path: /another/controller/path
2019-10-06 11:40:37.263 INFO http-bio-10009-exec-135 - init session with something=<null>,xxxxxxxx,userId=5678
2019-10-06 11:40:37.277 DEBUG http-bio-10009-exec-135 - ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@5f324b3c]
2019-10-06 11:40:37.277 DEBUG http-bio-10009-exec-135 - ==>  Preparing: select a.* from sometable a where a.user_id = ?
2019-10-06 11:40:37.277 DEBUG http-bio-10009-exec-135 - ==> Parameters: 5678(Long)
2019-10-06 11:40:37.277 INFO http-bio-10009-exec-135 - Filtering response of path: /another/controller/path

這是一段典型的Java應用日誌輸出示例。

4. 配置輸入源
vi filebeat.yml
在開頭Filebeat inputs部分找到以下片段:

- type: log

  # Change to true to enable this input configuration.
  enabled: false

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /var/log/*.log

enabled的值修改爲true,並將paths下的內容修改爲如下所示:

- type: log

  # Change to true to enable this input configuration.
  enabled: true

  # Paths that should be crawled and fetched. Glob based paths.
  paths:
    - /opt/data/my-app1-log/*.log

你也可以將該路徑指向你的應用日誌目錄。

保存退出。

這裏指定日誌採集器的類型是log,路徑就是我們上一步創建的路徑。

5. 測試配置
可以使用test命令對修改後的配置進行一個測試,確保沒有問題。

./filebeat test config -e

如果沒有問題的話最後會輸出Config OK字樣。

6. 啓動

./filebeat -e

其中-e參數表示將Filebeat本身的日誌輸出到標準錯誤中,並關閉syslog/file的輸出。

同樣,Filebeat官方也沒有提供後臺運行的方法,使用以下命令讓它在後臺運行:

nohup ./filebeat > /dev/null 2>&1 &

要結束的話,如果是前臺運行,按Ctrl+C即可。如果是後臺運行,使用以下命令查找PID,然後kill即可。

ps -ef |grep filebeaet

kill -15 pid

沒問題的話,會看到以下內容輸出(部分):

2019-11-24T18:17:07.729+0800	INFO	instance/beat.go:292	Setup Beat: filebeat; Version: 7.4.1
2019-11-24T18:17:07.729+0800	INFO	[index-management]	idxmgmt/std.go:178	Set output.elasticsearch.index to 'filebeat-7.4.1' as ILM is enabled.
2019-11-24T18:17:07.729+0800	INFO	elasticsearch/client.go:170	Elasticsearch url: http://localhost:9200
2019-11-24T18:17:07.730+0800	INFO	[publisher]	pipeline/module.go:97	Beat name: devServer1
2019-11-24T18:17:07.730+0800	INFO	[monitoring]	log/log.go:118	Starting metrics logging every 30s
2019-11-24T18:17:07.730+0800	INFO	instance/beat.go:422	filebeat start running.
2019-11-24T18:17:07.730+0800	INFO	registrar/registrar.go:145	Loading registrar data from /var/lib/filebeat-7.4.1-linux-x86_64/data/registry/filebeat/data.json
2019-11-24T18:17:07.730+0800	INFO	registrar/registrar.go:152	States Loaded from registrar: 0
2019-11-24T18:17:07.730+0800	INFO	crawler/crawler.go:72	Loading Inputs: 1
2019-11-24T18:17:07.730+0800	INFO	log/input.go:152	Configured paths: [/opt/data/my-app1-log/*.log]
2019-11-24T18:17:07.735+0800	INFO	input/input.go:114	Starting input of type: log; ID: 6209541038125597693
2019-11-24T18:17:07.735+0800	INFO	crawler/crawler.go:106	Loading and starting Inputs completed. Enabled inputs: 1
2019-11-24T18:17:07.735+0800	INFO	cfgfile/reload.go:171	Config reloader started
2019-11-24T18:17:07.735+0800	INFO	cfgfile/reload.go:226	Loading of config files completed.
2019-11-24T18:17:07.736+0800	INFO	log/harvester.go:251	Harvester started for file: /opt/data/my-app1-log/app.log
2019-11-24T18:17:10.729+0800	INFO	add_cloud_metadata/add_cloud_metadata.go:87	add_cloud_metadata: hosting provider type not detected.
2019-11-24T18:17:11.729+0800	INFO	pipeline/output.go:95	Connecting to backoff(elasticsearch(http://localhost:9200))
2019-11-24T18:17:11.825+0800	INFO	elasticsearch/client.go:743	Attempting to connect to Elasticsearch version 7.4.1
2019-11-24T18:17:11.866+0800	INFO	[index-management]	idxmgmt/std.go:252	Auto ILM enable success.
2019-11-24T18:17:12.018+0800	INFO	[index-management]	idxmgmt/std.go:265	ILM policy successfully loaded.
2019-11-24T18:17:12.018+0800	INFO	[index-management]	idxmgmt/std.go:394	Set setup.template.name to '{filebeat-7.4.1 {now/d}-000001}' as ILM is enabled.
2019-11-24T18:17:12.018+0800	INFO	[index-management]	idxmgmt/std.go:399	Set setup.template.pattern to 'filebeat-7.4.1-*' as ILM is enabled.
2019-11-24T18:17:12.018+0800	INFO	[index-management]	idxmgmt/std.go:433	Set settings.index.lifecycle.rollover_alias in template to {filebeat-7.4.1 {now/d}-000001} as ILM is enabled.
2019-11-24T18:17:12.018+0800	INFO	[index-management]	idxmgmt/std.go:437	Set settings.index.lifecycle.name in template to {filebeat-7.4.1 {"policy":{"phases":{"hot":{"actions":{"rollover":{"max_age":"30d","max_size":"50gb"}}}}}}} as ILM is enabled.
2019-11-24T18:17:12.019+0800	INFO	template/load.go:169	Existing template will be overwritten, as overwrite is enabled.
2019-11-24T18:17:12.125+0800	INFO	template/load.go:108	Try loading template filebeat-7.4.1 to Elasticsearch
2019-11-24T18:17:12.332+0800	INFO	template/load.go:100	template with name 'filebeat-7.4.1' loaded.
2019-11-24T18:17:12.332+0800	INFO	[index-management]	idxmgmt/std.go:289	Loaded index template.
2019-11-24T18:17:13.870+0800	INFO	[index-management]	idxmgmt/std.go:300	Write alias successfully generated.
2019-11-24T18:17:13.870+0800	INFO	pipeline/output.go:105	Connection to backoff(elasticsearch(http://localhost:9200)) established

可以看到Filebeat檢測到了一個日誌輸入並立即開始採集該日誌:

2019-11-24T18:17:07.730+0800	INFO	crawler/crawler.go:72	Loading Inputs: 1
2019-11-24T18:17:07.730+0800	INFO	log/input.go:152	Configured paths: [/opt/data/my-app1-log/*.log]
2019-11-24T18:17:07.735+0800	INFO	input/input.go:114	Starting input of type: log; ID: 6209541038125597693
2019-11-24T18:17:07.735+0800	INFO	crawler/crawler.go:106	Loading and starting Inputs completed. Enabled inputs: 1
2019-11-24T18:17:07.735+0800	INFO	cfgfile/reload.go:171	Config reloader started
2019-11-24T18:17:07.735+0800	INFO	cfgfile/reload.go:226	Loading of config files completed.
2019-11-24T18:17:07.736+0800	INFO	log/harvester.go:251	Harvester started for file: /opt/data/my-app1-log/app.log
2019-11-24T18:17:10.729+0800	INFO	add_cloud_metadata/add_cloud_metadata.go:87	add_cloud_metadata: hosting provider type not detected.
2019-11-24T18:17:11.729+0800	INFO	pipeline/output.go:95	Connecting to backoff(elasticsearch(http://localhost:9200))
2019-11-24T18:17:11.825+0800	INFO	elasticsearch/client.go:743	Attempting to connect to Elasticsearch version 7.4.1

採集的日誌接着被髮送到了 Elasticsearch 中,以下是ElasticSearch的部分日誌:

[2019-11-24T18:17:12,359][INFO ][o.e.c.m.MetaDataCreateIndexService] [devServer1] [filebeat-7.4.1-2019.11.24-000001] creating index, cause [api], templates [filebeat-7.4.1], shards [1]/[1], mappings [_doc]

四 數據展示及搜索

經過前面的操作以後,現在文件中的日誌已經被髮送到了 Elasticsearch 中。現在我們就可以檢索我們的日誌了。

4.1 創建索引模式

打開Kibana頁面,點擊菜單 Management >> Index Patterns,然後點擊頁面上的Create index pattern,在Index pattern輸入框中輸入filebeat-*關鍵字,當提示Success! Your index pattern matches 1 index.時,我們點擊Next step
IMAGE

然後在Time Filter field name下拉列表中選擇@timestamp作爲時間過濾字段,最後點擊Create index pattern按鈕,稍等幾秒,完成索引模式創建。

4.2 查詢日誌

索引模式創建完成後,現在終於可以查詢日誌了。點擊左側菜單Discover,進入查詢頁面,當前頁面默認查詢過去15分鐘的日誌,如果你的頁面顯示沒有查到任何東西,請調整一下時間段,比如將時間改爲查找今天,然後就能查到內容了:
IMAGE

你也可以試着在輸入框輸入日誌中出現的某個關鍵字進行搜索,搜索結果會高亮顯示。

五 最後

到此,我們的日誌查詢平臺就算告一段落了。可以看到,我們將日誌從應用節點採集彙總到了 Elasticsearch 中,然後可以通過 Kibana 進行各種檢索,這比登錄到服務器上使用tailcatgrep等命令方便多了,重要的是,Elastic Stack可以將你的多個應用的多個節點產生的日誌聚合到一塊,方便檢索和分析。
接下來,我們需要看看還有哪些配置需要注意,以及如何滿足在生產環境中的需要。

參考:

  1. Getting started with the Elastic Stack
  2. Getting Started With Filebeat
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章