Elasticsearch是一個開源搜索引擎,以易用性着稱。kibana是一個圖形界面,能夠在上面條件檢索存儲在ElasticSearch裏數據,至關於提供了ES的可視化操做管理器。html
fluentd是一個針對日誌的收集、處理、轉發系統。經過豐富的插件系統,能夠收集來自於各類系統或應用的日誌,轉化爲用戶指定的格式後,轉發到用戶所指定的日誌存儲系統之中。node
fluentd 經常被拿來和Logstash比較,咱們常說ELK,L就是這個agent。fluentd 是隨着Docker,GCP 和es一塊兒流行起來的agent。web
這篇文章裏歸納一下的話,有如下區別:docker
docker logs -f <容器id>
查看日誌,也能夠去/var/lib/docker/containers/<容器id>/<容器id>-json.log
查看日誌文件。可是這都很難去作查詢,本文介紹的EFK就能夠解決這個問題。咱們會建立四個容器:json
請安裝最新的docker及docker-compose,老版本會有些問題。centos
docker安裝,請參考連接:服務器
https://www.cnblogs.com/xiao987334176/p/11771657.html網絡
docker-compose安裝,請參考連接:架構
https://www.cnblogs.com/xiao987334176/p/12377113.htmlcurl
操做系統:centos 7.6
配置:2核8g
docker版本:19.03.6
docker-compose版本:1.24.1
本文使用一臺centos7.6服務器,來演示EFK。
注意:內存至少在4g或者以上。
咱們會建立四個容器:
請安裝最新的docker及docker-compose,老版本會有些問題。
docker安裝,請參考連接:
https://www.cnblogs.com/xiao987334176/p/11771657.html
docker-compose安裝,請參考連接:
https://www.cnblogs.com/xiao987334176/p/12377113.html
操做系統:centos 7.6
配置:2核8g
docker版本:19.03.6
docker-compose版本:1.24.1
本文使用一臺centos7.6服務器,來演示EFK。
注意:內存至少在4g或者以上。
建立一個空目錄
mkdir -p /opt/efk/目錄結構以下:
./ ├── docker-compose.yml └── fluentd ├── conf │ └── fluent.conf └── Dockerfiledocker-compose.yml
version: '2' services: web: image: httpd ports: - "1080:80" #避免和默認的80端口衝突 links: - fluentd logging: driver: "fluentd" options: fluentd-address: localhost:24224 tag: httpd.access fluentd: build: ./fluentd volumes: - ./fluentd/conf:/fluentd/etc links: - "elasticsearch" ports: - "24224:24224" - "24224:24224/udp" elasticsearch: image: elasticsearch:7.6.0 environment: - discovery.type=single-node expose: - 9200 ports: - "9200:9200" kibana: image: kibana:7.6.0 links: - "elasticsearch" ports: - "5601:5601"
注意:elasticsearch 7.6.0要使用單機模式,必須傳入環境變量discovery.type=single-node
全部web
裏的日誌會自動發送到fluentd-address: localhost:24224
,也就是fluentd
容器。
Elasticsearch 和 Kibana是目前最新的版本7.6.0,若是想要選擇更新的,能夠去這裏查看
Elasticsearch image tags in DockerHub
Kibana image tags in DockerHub
新建文件fluentd/Dockerfile
,使用官方鏡像Fluentd’s official Docker image,安裝須要的插件
# fluentd/Dockerfile FROM fluent/fluentd RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri"]而後新建文件
fluentd/conf/fluent.conf
,編寫Fluentd的配置文件
<source> @type forward port 24224 bind 0.0.0.0 </source> <match *.**> @type copy <store> @type elasticsearch host elasticsearch port 9200 logstash_format true logstash_prefix fluentd logstash_dateformat %Y%m%d include_tag_key true type_name access_log tag_key @log_name flush_interval 1s </store> <store> @type stdout </store> </match>
官方設置文檔config-file
此參數必定要改,不然Elasticsearch 沒法啓動
vm.max_map_count = 2621440
在後臺啓動,使用docker-compose up -d
# docker-compose up -d Starting efk_elasticsearch_1 ... done Starting efk_fluentd_1 ... done Starting efk_kibana_1 ... done Starting efk_web_1 ... done
查看全部容器
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d82b1a16c970 httpd "httpd-foreground" 21 hours ago Up 51 minutes 0.0.0.0:1080->80/tcp efk_web_1 1085be0f9c6e efk_fluentd "tini -- /bin/entryp…" 21 hours ago Up 51 minutes 5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp efk_fluentd_1 3e837917f4cf kibana:7.6.0 "/usr/local/bin/kiba…" 21 hours ago Up 51 minutes 0.0.0.0:5601->5601/tcp efk_kibana_1 3d860ca7e0db elasticsearch:7.6.0 "/usr/local/bin/dock…" 21 hours ago Up 51 minutes 0.0.0.0:9200->9200/tcp, 9300/tcp efk_elasticsearch_1
使用curl執行3遍
curl http://localhost:1080/ curl http://localhost:1080/ curl http://localhost:1080/
打開http://localhost:5601
,提示須要先建索引,輸入fluentd-*
刷新便可
選擇時間戳
去Discover
頁面,而後就能夠看到以前的日誌了。
這裏是以docker-compose形式啓動的一個服務,若是還有別的任務須要將日誌發送到fluentd
,須要這幾個步驟。
默認狀況下,docker-compose會爲咱們的應用建立一個網絡,服務的每一個容器都會加入該網絡中。這樣,容器就可被該網絡中的其餘容器訪問,不只如此,該容器還能以服務名稱做爲hostname被其餘容器訪問。
因此咱們首先須要找到咱們如今建立的EFK的網絡名,
# docker network ls
NETWORK ID NAME DRIVER SCOPE
afa576d45dff bridge bridge local27d56becedb8 efk_default bridge local1d5b4653e1df host host local
901f8a349049 none null local
我是在efk目錄下建立的docker-compose.yml文件,因此這裏默認的名字就是efk_default。
再看看以前web的設置
web: image: httpd ports: - "1080:80" #避免和默認的80端口衝突 links: - fluentd logging: driver: "fluentd" options: fluentd-address: localhost:24224 tag: httpd.access
有幾個關鍵設置是:links和logging,link 用於容器直接的互通,logging則是日誌的輸出設置。
那咱們這裏再啓動一個新docker須要這些設置
docker run \ --link efk_fluentd_1 \ --net efk_default \ --log-driver=fluentd \ --log-opt fluentd-address=localhost:24224 \ --log-opt tag=httpd.access \ -d hello-world
咱們去kibana看看,果真,日誌已經發送到kibana了。
搜索hello
若是是其餘機器,須要指定fluentd ip,好比:
docker run \ --log-driver=fluentd \ --log-opt fluentd-address=172.19.155.138:24224 \ --log-opt tag=httpd.access \ -d hello-world
最後想要作的就是如何在一臺服務器上搜集全部的日誌,理論上來講,只須要一臺服務器部署上EFK,暴露端口,其餘服務器去發送便可,實際上還沒試過。