博客 / 詳情

返回

裸機使用 filebeat 採集裸機上的日誌文件,併發到 elasticsearch

部署 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"

elasticsearchkibana 的版本要一致。同樣的,後面的 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 的版本

圖片.png

圖片.png

圖片.png

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 來抓包!

飛書20220723-005519.jpg

在 elasticsearch 中查看日誌

假設,到這一步的時候,你的 filebeat 已經成功才採集到了日誌,並且成功將日誌發送到了 elasticsearch

我們可以在 dbeaver 中查看(如果沒有安裝 dbeaver 可以跳過這一步)

圖片.png

可以看到,名為 ideamboom 的 index 中已經有 4 條日誌了

在 kibana 查看日誌

接下來就是重頭戲

我在瀏覽器打開了:http://192.168.31.245:5601

圖片.png

先點擊左上角的三條槓,然後點擊 management 下面的 StackManagement

圖片.png

再選擇『索引模式』,然後再選擇 『創建索引模式』

圖片.png

選擇之前創建的 ideamboom

因為我之前已經弄過了,所以這裏顯示已創建!

圖片.png

點擊左上角三條槓,選擇 『Discover』

圖片.png

選擇索引模式!

圖片.png

選擇合適的時間範圍,然後點擊『更新』

圖片.png

我們可以看到日誌了!

圖片.png

還可以在搜索框搜索指定關鍵字

elasticsearch 會幫我們分詞,然後建立倒排索引
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.