本文最初發表在我的個人博客,查看原文。
本文會帶你瞭解:
- 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 安裝及啓動順序
務必按以下順序安裝並啓動各個服務:
- Elasticsearch
- Kibana
- 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 默認監聽
9200
及9300
端口,請確認端口可用。
正常的話會返回以下內容:
{
"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
。:
由於默認沒有啓用鑑權,所以打開後直接就可以進入首頁了。
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:
然後在Time Filter field name下拉列表中選擇@timestamp
作爲時間過濾字段,最後點擊Create index pattern按鈕,稍等幾秒,完成索引模式創建。
4.2 查詢日誌
索引模式創建完成後,現在終於可以查詢日誌了。點擊左側菜單Discover,進入查詢頁面,當前頁面默認查詢過去15分鐘的日誌,如果你的頁面顯示沒有查到任何東西,請調整一下時間段,比如將時間改爲查找今天,然後就能查到內容了:
你也可以試着在輸入框輸入日誌中出現的某個關鍵字進行搜索,搜索結果會高亮顯示。
五 最後
到此,我們的日誌查詢平臺就算告一段落了。可以看到,我們將日誌從應用節點採集彙總到了 Elasticsearch 中,然後可以通過 Kibana 進行各種檢索,這比登錄到服務器上使用tail
,cat
,grep
等命令方便多了,重要的是,Elastic Stack可以將你的多個應用的多個節點產生的日誌聚合到一塊,方便檢索和分析。
接下來,我們需要看看還有哪些配置需要注意,以及如何滿足在生產環境中的需要。
參考: