你必須知道的容器日誌 (2) 開源日誌管理方案 ELK/EFK

本篇已加入《.NET Core on K8S學習實踐系列文章索引》,能夠點擊查看更多容器化技術相關係列文章。上一篇《你必須知道的容器日誌(1)》中介紹了Docker自帶的logs子命令以及其Logging driver,本篇將會介紹一個流行的開源日誌管理方案ELK。html

1、關於ELK

1.1 ELK簡介

  ELK 是Elastic公司提供的一套完整的日誌收集以及展現的解決方案,是三個產品的首字母縮寫,分別是ElasticSearchLogstashKibanagit

  • Elasticsearch是實時全文搜索和分析引擎,提供蒐集、分析、存儲數據三大功能
  • Logstash是一個用來蒐集、分析、過濾日誌的工具
  • Kibana是一個基於Web的圖形界面,用於搜索、分析和可視化存儲在 Elasticsearch指標中的日誌數據   

1.2 ELK日誌處理流程

   上圖展現了在Docker環境下,一個典型的ELK方案下的日誌收集處理流程:github

  • Logstash從各個Docker容器中提取日誌信息
  • Logstash將日誌轉發到ElasticSearch進行索引和保存
  • Kibana負責分析和可視化日誌信息

  因爲Logstash在數據收集上並不出色,並且做爲Agent,其性能並不達標。基於此,Elastic發佈了beats系列輕量級採集組件。docker

  這裏咱們要實踐的Beat組件是Filebeat,Filebeat是構建於beats之上的,應用於日誌收集場景的實現,用來替代 Logstash Forwarder 的下一代 Logstash 收集器,是爲了更快速穩定輕量低耗地進行收集工做,它能夠很方便地與 Logstash 還有直接與 Elasticsearch 進行對接。json

  本次實驗直接使用Filebeat做爲Agent,它會收集咱們在第一篇《Docker logs & logging driver》中介紹的json-file的log文件中的記錄變更,並直接將日誌發給ElasticSearch進行索引和保存,其處理流程變爲下圖,你也能夠認爲它能夠稱做 EFK。vim

2、ELK套件的安裝

  本次實驗咱們採用Docker方式部署一個最小規模的ELK運行環境,固然,實際環境中咱們或許須要考慮高可用和負載均衡。架構

  首先拉取一下sebp/elk這個集成鏡像,這裏選擇的tag版本是640(最新版本已是7XX了):負載均衡

docker pull sebp/elk:640

  注:因爲其包含了整個ELK方案,因此須要耐心等待一會。elasticsearch

  經過如下命令使用sebp/elk這個集成鏡像啓動運行ELK:工具

docker run -it -d --name elk \ -p 5601:5601 \ -p 9200:9200 \ -p 5044:5044 \ sebp/elk:640

  運行完成以後就能夠先訪問一下 http://[Your-HostIP]:5601 看看Kibana的效果:  

  Kibana管理界面

Kibana Index Patterns界面

  固然,目前沒有任何能夠顯示的ES的索引和數據,再訪問一下http://[Your-HostIP]:9200 看看ElasticSearch的API接口是否可用:

ElasticSearch API

  Note:若是啓動過程當中發現一些錯誤,致使ELK容器沒法啓動,能夠參考《Docker啓動ElasticSearch報錯》及《ElasticSearch啓動常見錯誤》一文。若是你的主機內存低於4G,建議增長配置設置ES內存使用大小,以避免啓動不了。例以下面增長的配置,限制ES內存使用最大爲1G:

docker run -it -d --name elk \ -p 5601:5601 \ -p 9200:9200 \ -p 5044:5044 \
  -e ES_MIN_MEM=512m \ -e ES_MAX_MEM=1024m \ sebp/elk:640

3、Filebeat配置

3.1 安裝Filebeat

  這裏咱們經過rpm的方式下載Filebeat,注意這裏下載和咱們ELK對應的版本(ELK是6.4.0,這裏也是下載6.4.0,避免出現錯誤):

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-x86_64.rpm
rpm -ivh filebeat-6.4.0-x86_64.rpm

3.2 配置Filebeat  

   這裏咱們須要告訴Filebeat要監控哪些日誌文件 及 將日誌發送到哪裏去,所以咱們須要修改一下Filebeat的配置:

cd /etc/filebeat vim filebeat.yml

  要修改的內容爲:

  (1)監控哪些日誌?

filebeat.inputs: # Each - is an input. Most options can be set at the input level, so # you can use different inputs for various configurations. # Below are the input specific configurations. - type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: - /var/lib/docker/containers/*/*.log - /var/log/syslog

  這裏指定paths:/var/lib/docker/containers/*/*.log,另外須要注意的是將 enabled 設爲 true。

  (2)將日誌發到哪裏?

#-------------------------- Elasticsearch output ------------------------------ output.elasticsearch: # Array of hosts to connect to. hosts: ["192.168.16.190:9200"] # Optional protocol and basic auth credentials. #protocol: "https" #username: "elastic" #password: "changeme"

  這裏指定直接發送到ElasticSearch,配置一下ES的接口地址便可。

  Note:若是要發到Logstash,請使用後面這段配置,將其取消註釋進行相關配置便可:

#----------------------------- Logstash output -------------------------------- #output.logstash: # The Logstash hosts #hosts: ["localhost:5044"] # Optional SSL. By default is off. # List of root certificates for HTTPS server verifications #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] # Certificate for SSL client authentication #ssl.certificate: "/etc/pki/client/cert.pem" # Client Certificate Key #ssl.key: "/etc/pki/client/cert.key"

3.3 啓動Filebeat

  因爲Filebeat在安裝時已經註冊爲systemd的服務,因此只須要直接啓動便可:

systemctl start filebeat.service

  檢查Filebeat啓動狀態:

systemctl status filebeat.service

3.4 驗證Filebeat

  經過訪問ElasticSearch API能夠發現如下變化:ES創建了以filebeat-開頭的索引,咱們還可以看到其來源及具體的message。

4、Kibana配置

  接下來咱們就要告訴Kibana,要查詢和分析ElasticSearch中的哪些日誌,所以須要配置一個Index Pattern。從Filebeat中咱們知道Index是filebeat-timestamp這種格式,所以這裏咱們定義Index Pattern爲 filebeat-*

  點擊Next Step,這裏咱們選擇Time Filter field name爲@timestamp:

  單擊Create index pattern按鈕,便可完成配置。

  這時咱們單擊Kibana左側的Discover菜單,便可看到容器的日誌信息啦:

  仔細看看細節,咱們關注一下message字段:

  能夠看到,咱們重點要關注的是message,所以咱們也能夠篩選一下只看這個字段的信息:

  此外,Kibana還提供了搜索關鍵詞的日誌功能,例如這裏我關注一下日誌中包含unhandled exception(未處理異常)的日誌信息:

  這裏只是樸素的展現了導入ELK的日誌信息,實際上ELK還有不少很豐富的玩法,例如分析聚合、炫酷Dashboard等等。筆者在這裏也是初步使用,就介紹到這裏啦。

5、Fluentd引入

5.1 關於Fluentd

  前面咱們採用的是Filebeat收集Docker的日誌信息,基於Docker默認的json-file這個logging driver,這裏咱們改用Fluentd這個開源項目來替換json-file收集容器的日誌。

  Fluentd是一個開源的數據收集器,專爲處理數據流設計,使用JSON做爲數據格式。它採用了插件式的架構,具備高可擴展性高可用性,同時還實現了高可靠的信息轉發。Fluentd也是雲原生基金會 (CNCF) 的成員項目之一,遵循Apache 2 License協議,其github地址爲:https://github.com/fluent/fluentd/。Fluentd與Logstash相比,比佔用內存更少、社區更活躍,二者的對比能夠參考這篇文章《Fluentd vs Logstash》。

  所以,整個日誌收集與處理流程變爲下圖,咱們用 Filebeat 將 Fluentd 收集到的日誌轉發給 Elasticsearch。

   固然,咱們也可使用Fluentd的插件(fluent-plugin-elasticsearch)直接將日誌發送給 Elasticsearch,能夠根據本身的須要替換掉Filebeat,從而造成Fluentd => ElasticSearch => Kibana 的架構,也稱做EFK。

5.2 運行Fluentd

  這裏咱們經過容器來運行一個Fluentd採集器:

docker run -d -p 24224:24224 -p 24224:24224/udp -v /edc/fluentd/log:/fluentd/log fluent/fluentd

  默認Fluentd會使用24224端口,其日誌會收集在咱們映射的路徑下。

  此外,咱們還須要修改Filebeat的配置文件,將/edc/fluentd/log加入監控目錄下:

#=========================== Filebeat inputs ============================= filebeat.inputs: # Each - is an input. Most options can be set at the input level, so # you can use different inputs for various configurations. # Below are the input specific configurations. - type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: - /edc/fluentd/log/*.log

  添加監控配置以後,須要從新restart一下filebeat:

systemctl restart filebeat

5.3 運行測試容器

  爲了驗證效果,這裏咱們Run兩個容器,並分別制定其log-dirver爲fluentd:

docker run -d \ --log-driver=fluentd \ --log-opt fluentd-address=localhost:24224 \ --log-opt tag="test-docker-A" \ busybox sh -c 'while true; do echo "This is a log message from container A"; sleep 10; done;' docker run -d \ --log-driver=fluentd \ --log-opt fluentd-address=localhost:24224 \ --log-opt tag="test-docker-B" \ busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'

  這裏經過指定容器的log-driver,以及爲每一個容器設立了tag,方便咱們後面驗證查看日誌。

5.4 驗證EFK效果

  這時再次進入Kibana中查看日誌信息,即可以經過剛剛設置的tag信息篩選到剛剛添加的容器的日誌信息了:

6、小結

  本文從ELK的基本組成入手,介紹了ELK的基本處理流程,以及從0開始搭建了一個ELK環境,演示了基於Filebeat收集容器日誌信息的案例。而後,經過引入Fluentd這個開源數據收集器,演示瞭如何基於EFK的日誌收集案例。固然,ELK/EFK有不少的知識點,筆者也還只是初步使用,但願將來可以分享更多的實踐總結。

參考資料

CloudMan,《天天5分鐘玩轉Docker容器技術

一杯甜酒,《ELK學習總結

於老三,《快速搭建ELK日誌分析系統

zpei0411,《Logstash beats系列 & Fluentd

曹林華,《從ELK到EFK的演進

 

做者:周旭龍

出處:https://edisonchou.cnblogs.com

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

原文出處:https://www.cnblogs.com/edisonchou/p/docker_logs_study_summary_part2.html

相關文章
相關標籤/搜索