基於Docker的ELK日誌採集系統搭建

ELK的概念

ELK是Elasticsearch、Logstash、Kibana三大開源框架首字母大寫簡稱。市面上也被成爲Elastic Stack。其中Elasticsearch是一個基於Lucene、分佈式、通過Restful方式進行交互的近實時搜索平臺框架。像類似百度、谷歌這種大數據全文搜索引擎的場景都可以使用Elasticsearch作爲底層支持框架,可見Elasticsearch提供的搜索能力確實強大,市面上很多時候我們簡稱Elasticsearch爲es。Logstash是ELK的中央數據流引擎,用於從不同目標(文件/數據存儲/MQ)收集的不同格式數據,經過過濾後支持輸出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以將elasticsearch的數據通過友好的頁面展示出來,提供實時分析的功能。

安裝docker-compose

參考文章 Docker搭建RabbitMQ

編寫docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.1.1
    container_name: elasticsearch7.1.1
    ulimits:        # 棧內存的上限
      memlock:
        soft: -1    # 不限制
        hard: -1    # 不限制
    hostname: elasticsearch
    restart: always
    environment:
      - node.name=node-1
      - node.master=true
      - http.port=9200
      - cluster.initial_master_nodes=node-1
      - http.cors.enabled=true
      - http.cors.allow-origin=*
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      envdm:
        aliases:
          - elasticsearch
  kibana:
    image: docker.elastic.co/kibana/kibana:7.1.1
    container_name: kibana7.1.1
    environment:
      XPACK_MONITORING_ENABLED: "true"
      XPACK_MONITORING_UI_CONTAINER_ELASTICSEARCH_ENABLED: "true"
      ELASTICSEARCH_HOSTS: http://172.16.0.7:9200
      CSP_STRICT: "true"
      SERVER_BASEPATH: "/kbstatic"
      I18N_LOCALE: "zh-CN"
    depends_on:
      - elasticsearch
    restart: always
    ports:
      - 5601:5601
    volumes:
      - /data/elk/kibana.yml:/etc/kibana/kibana.yml
    networks:
      envdm:
        aliases:
          - kibana
  logstash:
    image: docker.elastic.co/logstash/logstash:7.1.1
    container_name: logstash7.1.1
    hostname: logstash
    restart: always
    depends_on:
      - elasticsearch
    volumes:
      - /data/elk/logstash.conf:/etc/logstash/conf.d/logstash.conf
      - /data/elk/logstash.yml:/etc/logstash/logstash.yml
    ports:
      - 9600:9600
      - 5044:5044
    networks:
      envdm:
        aliases:
          - logstash

networks:
  envdm:
    driver: bridge
       

執行build

編寫好docker-compose.yml之後再同級目錄下面執行如下腳本

docker-compose build

創建配置文件

這裏我們把容器內部的配置文件掛在宿主機裏面

touch kibana.yml   logstash.yml logstash.conf

啓動容器

nohup docker-compose up 1>elk.log 2>&1 &

logstash的配置需要進入容器內部 修改修改pipline.yml裏面的配置文件路徑,不然會使用默認的配置文件,導致容器掛載不生效

安裝filebeat

下面列舉了兩種安裝方式,取其一即可

rpm:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.1-x86_64.rpm 
sudo rpm -vi filebeat-7.1.1-x86_64.rpm

tar:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.1.1-darwin-x86_64.tar.gz 
tar xzvf filebeat-7.1.1-darwin-x86_64.tar.gz 
cd filebeat-7.1.1-darwin-x86_64/

filebeat 配置

type : 當前輸入數據源的類型
enabled:啓用當前輸入
paths: 路徑數組,數據源的路徑
tags:標籤,可用於的logstash裏面區分數據來源
tail_files : 從文件尾部開始輸入
fields:可以添加自定義子字段
在這裏插入圖片描述

字符編碼配置

在日誌輸出的時候有可能會出現中文亂碼的情況,我們需要配置一下編碼
在這裏插入圖片描述

多行合併配置

配置多行合並可以用於把多行記錄合併爲一行記錄,最典型的就是我們的異常堆棧信息

#java異常信息的處理
multiline.pattern: '^[[:space:]]+(at|\.{3})\b|^Caused by:'
multiline.negate: false
multiline.match: after

logstash配置

logstash的配置類似於管道的模式。
首先是input,標識輸入的數據源,這裏配置的是filebeat
然後是filter 裏面可以使用grok對日誌進行格式化,具體使用可以搜索grok表達式,或者使用正則表達式
也可以使用mutate刪除指定字段,output是把處理之後的日誌輸出到指定的目標位置,可以是ES

# 接受filebeat的日誌輸入
input{
    beats {
    port => 5044
    }
}

filter {
	# 格式化日誌信息
	grok{
		    match => {"message" => "%{TIMESTAMP_ISO8601:time}%{SPACE}%{LOGLEVEL:level}%{SPACE}%{NUMBER:pid}\s*%{DATA:no1}\s*\[%{DATA:thread}]\s*%{DATA:path}\s*\:\s*%{GREEDYDATA:msg}"}
	}
# 刪除無關字段
	mutate {
	      remove_field => ["host","tags","no1","beat","@version","prospector","input"]
	    }
	}
	output{
		# 輸出到ES
		if "back-base-data"==[fields][type]  {
		elasticsearch {
		                hosts => ["172.16.0.7:9200"]
		                index => "back-basedata-index"
		        }
		}
		else if "back-customer-portal"==[fields][type] {
		
		    elasticsearch {
		        hosts => ["172.16.0.7:9200"]  
		        index => "back-customer-portal-index"
		    }
		}    
		else if "back-system-config"==[fields][type] {
		
		        elasticsearch {
		                hosts => ["172.16.0.7:9200"]
		                index => "back-system-config-index"        }
		}
		else if "back-customer-management"==[fields][type] {
		
		        elasticsearch {
		                hosts => ["172.16.0.7:9200"]
		                index => "back-customer-management-index"
		       }
		}
		else if "back-suppliers-management"==[fields][type] {
		
		        elasticsearch {
		                hosts => ["172.16.0.7:9200"]
		                index => "back-suppliers-management-index"
		        }
		}
	}
}

完成

上面啓動好elk之後就可以進入kibana控制檯界面,我們先要在kibana的配置模塊裏面找到索引配置,配置好對應的索引模式,這裏我就配置了一個back*的索引模式,配置好之後可以kibana查看數據
在這裏插入圖片描述
至於後面怎麼去對數據進行統計分析就看你自己的了

最後說一點

搭建這個東西不難,但是用好這個東西,從裏面提取出有價值有意義的數據缺失是一件不容易的事情,所以我們作爲開發人員在開發的時候應該要學會規範的打日誌,一些無用的日誌只會讓系統看起來亂糟糟

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章