ELK Stack

軟體說明

ELK 是由 Elasticsearch、Logstash、Kibana 所組成

Elasticsearch 是一套開源式的分散式搜尋引擎 Elasticsearch - 官方文件

Logstash 可將蒐集到的Log做進一步處理,Parse成統一格式 Logstash - 官方文件

Kibana 則是可將Elasticsearch的資料 視覺化的呈現在前端 Kibana - 官方文件

擴充工具
beats 是輕量級的系統監測收集器,可將收集到的 data 進行轉拋

beat有很多種工具可參考 beats - 官方文件

本文使用到 Filebeat - 官方文件 可即時監測Log檔是否異動,進行資料轉拋

機器環境&服務

環境
Linux Server: Ubuntu 18.04.6 LTS
服務: Kibana、ElasticSeatch、LogStash、Redis

Windows Clinet: Win 10
服務: Filebeat

範例說明


透過 Filebeat 監控在 Windows機器上的Log檔 及時拋送Log資料到
Linux機器的Redis上,而LogStash 會抓Redis上的資料 進行二次資料Parse處理,再轉拋到ElasticSeatch上,最後在Kibana呈現

Linux Server 端安裝服務

安裝Docker

參考 w4560000 - Linux 安裝 Docker、Docker-Compose

建立 logstash.conf

目前目錄

# 建立 Logstash 資料夾
mkdir logstash

# 建立 conf.d 資料夾
cd logstash 
mkdir conf.d

cd conf.d
vim logstash.conf

修改 logstash.conf

input {
    redis {
        host => "redis"
        port => 6379
        data_type => "list"
        key => "log_test"
        password => "xxx"
    }
}
output {
    elasticsearch {
        hosts => ["elasticsearch"]
        index => "%{[fields][env]}_%{[fields][service]}-%{+YYYY.MM.dd}"
    }
}

docker-compose 建立 redis、logstash、elasticsearch、kibana 服務


#返回 logstash 所屬目錄
cd ../..

vim docker-compose.yml
version: '3'
services:
  kibana:
    container_name: kibana
    image: kibana:7.8.0
    depends_on:
      - elasticsearch
    ports:
      - 5601:5601
    environment:
      SERVER_NAME: kibana-server
      ELASTICSEARCH_HOSTS: http://elasticsearch:9200
  logstash:
    container_name: logstash
    image: logstash:5.3.1
    ports:
      - 5044:5044
    restart: always
    environment:
      LOG_LEVEL: error
    command: -f /etc/logstash/conf.d/
    volumes:
      - ./logstash/conf.d/:/etc/logstash/conf.d
    depends_on:
      - elasticsearch
  elasticsearch:
    container_name: elasticsearch
    image: elasticsearch:7.8.0
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
    volumes:
      - /data01:/usr/share/elasticsearch/data
  redis:
    container_name: redis
    image: redis:3.2.4
    entrypoint: redis-server --maxmemory "4gb" --requirepass xxx
    ports:
      - 6379:6379
    restart: always
    volumes:
      - /data/redis:/data
    sysctls:
      net.core.somaxconn: '511'

將服務跑起來

返回根目錄

sudo mkdir data01
sudo chmod 777 data01

# 返回 docker-compose.yml 所屬目錄
sudo docker-compose up -d

當ElasticSearch 發生錯誤 建立失敗時 出現錯誤訊息
ElasticsearchException[failed to bind service]; nested: AccessDeniedException[/usr/share/elasticsearch/data/nodes];
因為Container內/usr/share/elasticsearch/data/nodes 與 主機的data01綁定 需設定 data01的資料夾權限

確認服務是否正常

ElasticSearch

Kibana

至此 Linux Server 服務已經建立完成

Windows Client 端安裝服務

安裝 Filebeat

filebeat-7-7-0下載連結

設定filebeat.yml

解壓縮後 開啟資料夾 修改 filebeat.yml

...略
- input_type: log
  enabled: true
  paths: D:\LogFiles\WebLog\ELK_Test\*.log
  fields:
      service: weblog
  fields.webtype: ELK_Test
  multiline.pattern: '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'
  multiline.negate: true
  multiline.match: after
...略

最下面 output 設定輸出 redis

output.redis:
  # Boolean flag to enable or disable the output module.
  enabled: true

  # The list of Redis servers to connect to. If load balancing is enabled, the
  # events are distributed to the servers in the list. If one server becomes
  # unreachable, the events are distributed to the reachable servers only.
  # hosts: ["localhost"]
  # Your Redis Server IP
  hosts: ["x.x.x.x"]

  # The Redis port to use if hosts does not contain a port number. The default
  # is 6379.
  # port: 14011

  # The name of the Redis list or channel the events are published to. The
  # default is filebeat.
  key: log_test

  # The password to authenticate with. The default is no authentication.
  password: xxx

當有資料寫進 D:\LogFiles\WebLog\ELK_Test*.log時,filebeat會將資料存入Redis

啟動Filebeat服務

CD 至 filebeat-7.7.0-windows-x86_64 資料夾
以系統管理員 開啟 powershell 將 filebeat 註冊至 windows service

./install-service-filebeat

windows service中 啟動 filebeat

至此 Filebeat 服務已經建立完成

kibana 建立 index pattern

http://YourIP:5601/app/kibana#/home

進入 Management => Stack Management

點擊 Index Patterns => Create index pattern

建立 index pattern

需有現有的 index 才能建立 index pattern
dev_weblog-2022.01.07 為 logstash 從 redis 取資料後寫入 elasticsearch 的

確認Kibana Log資料

點擊 剛剛建立的 index pattern : dev_weblog*

可以發現 message 中的 Log 時間跟 ElasticSeatch 的 Time 不同
因為 Filebeat 轉拋時會傳轉拋資料當下的時間,跟 Log 的時間會有落差
下一篇 w4560000 - Logstash Parse Timestamp 會說明在Logstash Parse資料時 處理時間差


轉載請註明來源,若有任何錯誤或表達不清楚的地方,歡迎在下方評論區留言,也可以來信至 leozheng0621@gmail.com
如果文章對您有幫助,歡迎斗內(donate),請我喝杯咖啡

斗內💰

×

歡迎斗內

github