部署 elasticsearch 和 kibana
因為是 demo 性質的使用,所以就用 docker-compose 簡單跑一下
version: "3"
services:
elk-elasticsearch:
container_name: elk-elasticsearch
image: elasticsearch:7.17.1
ports:
- "9200:9200"
- "9300:9300"
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms1g -Xmx1g" # 限制 es 的內存大小,不然會吃掉 10GB+ 的 RAM
elk-kibana:
container_name: elk-kibana
image: kibana:7.17.1
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://192.168.31.245:9200
volumes:
- ./kibana.yml:/usr/share/kibana/config/kibana.yml # kibana 其實是支持中文的,只要在 /usr/share/kibana/config/kibana.yml 加一行 i18n.locale: "zh-CN"
/kibana.yml 的內容,主要是為了顯示中文
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: ["http://192.168.31.174:9200"]
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
elasticsearch 和 kibana 的版本要一致。同樣的,後面的 filebeat 也要版本一致!
這次我們都用 7.17.1
如果需要用 dbeaver 之類的工具連接 elasticsearch 遇到 current license is non-compliant for [jdbc],可以參考:current license is non-compliant for jdbc 解決!
創建索引
一開始,我參考了這個教程:EFK 搭建簡單的日誌分析系統
不得不説這個教程寫的非常的爛,缺斤短兩,但即便如此,這已經還是谷歌搜索出來排名靠前
部署好了 elasticsearch 和 kibana 之後,我們需要去 elasticsearch 創建索引
為什麼需要創建索引(index)?
index這個概念在 elasticsearch 中就相當於 mysql 中的 table(elasticsearch 沒有 db 這個概念)。主要注意的是,elasticsearch 的 index,創建的時候,只給一個index name就可以,不需要定義 schema。
我們需要 index 作為日誌的存儲容器,不同 index 存儲不同 project 或者説不同業務的日誌。總不能把所有日誌都存在同一個 index 吧!
怎麼創建索引?方法有很多,比如:
- 通過
dbeaver,連接到 elasticsearch,然後在 dbeaver 為 elasticsearch 創建索引 - 使用
kibana連接到 elasticsearch,然後在 kibana 為 elasticsearch 創建索引 - 使用
python、java 等編程語言提供的elasticsearch client sdk直接連接到 elasticsearch 創建索引
使用 Python 創建 elasticsearch 的 index
我選擇 python,因為我對這個最熟悉
python 的 elasticsearch client sdk 版本也要版本保持一致!
pip install elasticsearch==7.17.1關於如何使用 elasticsearch client sdk 操作 elasticsearch,可以參考這篇文章: Elasticsearch 基本介紹及其與 Python 的對接實現 (這個文章中的 elasticsearch client sdk 比較老,所以一些 api 的參數名等等都發生了變化了 )
下面給幾個參考代碼:
創建 index, 我這裏就叫做 ideaboom 了
from elasticsearch import Elasticsearch
es = Elasticsearch("http://192.168.31.245:9200")
result = es.indices.create(index='ideaboom')
print(result)
這裏很簡單,實際上,你還需要添加一些參數,比如指定 index 的『副本數』、『分片數』。比如你的 elasticsearch 集羣有 3 個 node,那『分片數』就應該是 3 的倍數,這樣才能更好的利用集羣的資源!
使用 Kibana 創建 elasticsearch 的 index
貌似使用 python 的 sdk 創建的 index,不能指定『分片數』和『副本數』,所以,補充一個 Kibana 的版本
PUT crawlab
{
"settings" : {
"index" : {
"number_of_shards" : 9,
"number_of_replicas" : 1
}
}
}
參考:ElasticSearch 設置分片數量及副本數量
裸機使用 filebeat 採集裸機上的日誌文件,併發到 elasticsearch
先安裝 filebeat
參考:Filebeat quick start: installation and configuration
在 debian 系中安裝 filebeat7.17.1
下載:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.1-amd64.deb
超級快,都不需要代理
安裝:
sudo apt install ./filebeat-7.17.1-amd64.deb
使用 filebeat 採集數據,併發送到 elasticsearch
關於 filebeat 的語法,可以參考:filebeat輸出結果到elasticsearch的多個索引
我的 filebeat.yml 內容如下:
filebeat.inputs:
- type: log
# Change to true to enable this input configuration.
enabled: true
# Paths that should be crawled and fetched. Glob based paths.
paths:
# 日誌實際路徑地址
- /home/bot/Desktop/coder/ideaboom/test_ELK_EFK/logs/run.log
fields:
# 日誌標籤,區別不同日誌,下面建立索引會用到
type: "ideaboom"
fields_under_root: true
# 指定被監控的文件的編碼類型,使用plain和utf-8都是可以處理中文日誌的
encoding: utf-8
# setup.kibana:
# host: "192.168.31.245:5601"
setup.ilm.enabled: false
output.elasticsearch:
hosts: ["192.168.31.245:9200"]
indices:
#索引名稱,一般為 ‘服務名稱+ip+ --%{+yyyy.MM.dd}’。
- index: "ideaboom-%{+yyyy.MM.dd}"
when.contains:
#標籤,對應日誌和索引,和上面對應
type: "ideaboom"
前面已經在 elasticsearch 創建了名為 ideaboom 的 index
採集的是 run.log 文件,我往這個文件中隨便放一點東西:
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013414]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013415]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013414]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013415]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013414]
2022-07-08 02:39:39,746 - 13651 - logger - INFO - total [1] urls, max_id [69013415]
類似 nginx,我們需要把自己的 yml 映射到 filebeat 的默認配置文件路徑
sudo cp /home/bot/Desktop/coder/ideaboom/test_ELK_EFK/filebeat.yml /etc/filebeat/filebeat.yml
關於默認配置文件路徑的問題,可以參考:為什麼使用了 -c 參數,filebeat 還是去加載 etc 中的 filebeat.yml?
運行 filebeat
sudo filebeat
注意,運行 filebeat 有很多的坑,filebeat 為了所以的數據安全,要求 root 運行 filebeat,如果不是 root 運行,相關的配置文件的 owner 必須要是運行 filebeat user 保持一致等等。不然會遇到
ubuntu debian Exiting: error loading config file: open /etc/filebeat/filebeat.yml: permission denied類似的報錯!還有一點需要超級注意,filebeat 是沒有輸出的,就是不管有沒有采集到日誌,有沒有把日誌發送到 elasticsearch 他都不會告訴你!(可能有辦法可以知道,但是我不知道怎麼搞),這就很坑,為了知道 filebeat 有沒有正常工作,我還特意開了 wireshark 來抓包!
在 elasticsearch 中查看日誌
假設,到這一步的時候,你的 filebeat 已經成功才採集到了日誌,並且成功將日誌發送到了 elasticsearch
我們可以在 dbeaver 中查看(如果沒有安裝 dbeaver 可以跳過這一步)
可以看到,名為 ideamboom 的 index 中已經有 4 條日誌了
在 kibana 查看日誌
接下來就是重頭戲
我在瀏覽器打開了:http://192.168.31.245:5601
先點擊左上角的三條槓,然後點擊 management 下面的 StackManagement
再選擇『索引模式』,然後再選擇 『創建索引模式』
選擇之前創建的 ideamboom
因為我之前已經弄過了,所以這裏顯示已創建!
點擊左上角三條槓,選擇 『Discover』
選擇索引模式!
選擇合適的時間範圍,然後點擊『更新』
我們可以看到日誌了!
還可以在搜索框搜索指定關鍵字
elasticsearch 會幫我們分詞,然後建立倒排索引