使用ELK處理Docker日誌(一)

2021-02-19 優雲數智

Daniel Berman( Logz.io產品經理)為了紀念Docker四歲生日,撰寫一系列文章,介紹如何使用ELK收集和處理Dockerized環境日誌。小數今天給大家帶來的第一部分將介紹如何安裝各個組件以及不同日誌收集方案的特點,下一部分將側重於分析和可視化,近期發出,記得關注我們噢~

PS:數人云工程師們已奔赴奧斯汀DockerCON2017現場,更多最佳實踐後天為您奉上!DockerCon2017,我們又雙叒叕要來了

容器運行程序時產生的日誌具有「無常,分布,隔離」等特點,因此在架構中收集Docker日誌面臨很大的挑戰,有待嘗試一種強有力的日誌收集和處理方案來解決此類複雜問題。

ELK (Elasticsearch,Logstash和Kibana)是處理容器日誌的一種方式,儘管設置ELK工作流並不容易(難度取決於環境規格),但最終可以使用Kibana的監控面板來展示Docker日誌:

Dockerized環境中的典型ELK日誌收集流程如下所示:

Logstash負責從各種Docker容器和主機中提取日誌,這個流程的主要優點是可以更好地用過濾器來解析日誌,Logstash將日誌轉發到Elasticsearch進行索引,Kibana分析和可視化數據。

當然這個流程可以有多種不同的實現方式, 例如可以使用不同的日誌收集和轉發組件, 如Fluentd或Filebeat 將日誌發送到Elasticsearch,或者,添加一個由Kafka或Redis容器組成的中間層,作為Logstash和Elasticsearch之間的緩衝區。上圖顯示了日誌從Docker到ELK的基本流程。

那麼,如何設置這個流程呢?

可以將ELK套件安裝在一個容器裡,也可以使用不同的容器來分別安裝各個組件。 

關於在Docker上部署ELK是否是生產環境的可行性解決方案(資源消耗和網絡是主要問題)仍然存在很多爭議,但在開發中這是一種非常方便高效的方案。

ELK的docker鏡像推薦使用 docker-elk, 它支持豐富的運行參數(可使用這些參數組合不同的版本)和文檔, 而且完全支持最新版本的 Elasticsearch, Logstash, 和 Kibana.

在安裝組件之前需要確保以下埠沒有被佔用:5601 (Kibana), 9200 (Elasticsearch), and 5044 (Logstash).

同時需要確保內核參數 vm_max_map_count 至少設置為262144:

sudo sysctl -w vm.max_map_count=262144

運行如下命令:

git clone https://github.com/deviantony/docker-elk.gitcd docker-elk docker-compose up

正常情況下, ELK套件的三個服務(Elasticsearch, Logstash, Kibana)會啟動成功,默認持久化數據目錄 /var/lib/elasticsearch ( Elasticsearch 的數據存儲目錄 )

** 此處原始碼請點擊「閱讀原文」查看

可通過如下的方式來確保所有組件都能正常運行。

首先嘗試訪問Elasticsearch運行如下命令:

curl localhost:9200

輸出結果:

{

 "name" : "W3NuLnv",

 "cluster_name" : "docker-cluster",

 "cluster_uuid" : "fauVIbHoSE2SlN_nDzxxdA",

 "version" : {

   "number" : "5.2.1",

   "build_hash" : "db0d481",

   "build_date" : "2017-02-09T22:05:32.386Z",

   "build_snapshot" : false,

   "lucene_version" : "6.4.1" },

 "tagline" : "You Know, for Search"}

打開 Kibaba 頁面通過http://[serverIP]:5601:

值得注意的是需要輸入索引模式才能正常進行後續處理,這個稍後將會介紹。

安裝組件比較簡單,相比而言將Docker日誌發送到ELK有點複雜,這取決於輸出日誌的方式。

如果沒有額外指定,容器的stdout和stderr輸出(也稱為「docker logs」)輸出到JSON文件。所以,如果是一個小型Docker環境,使用Filebeat來收集日誌將是不錯的選擇。但如果使用其他日誌記錄驅動程序,則可能需要考慮其他方法。

使用Filebeat

Filebeat屬於Elastic的Beats系列日誌收集組件, Filebeat是用Go語言開發的,支持追蹤特定文件和日誌加密的中間組件,它可以配置將日誌導出到Logstash或者直接導出到Elasticsearch.

如上所述,若使用默認的json文件記錄驅動程序,Filebeat是一種相對簡便的方式,可以輸出日誌到ELK.Filebeat部署在主機上,或將其作為容器與ELK容器一起運行(在這種情況下,需要添加到ELK容器的連結),這裡有各種Filebeat Docker images可用,有些包括運行Filebeat並將其連接到Logstash的配置。

Filebeat配置將需要指定JSON日誌文件的路徑(位於:/ var / lib / docker / containers / ...)和目標的詳細信息(通常是Logstash容器)。

下面是一個配置的例子:

prospectors:     

 - paths:        

   - /var/log/containers/<xxx>          

   document_type: syslog     

output:

 logstash:  

  enabled: true  

  hosts:   

      - elk:5044

使用日誌驅動

Docker從1.12開始支持Logging Driver,允許將Docker日誌路由到指定的第三方日誌轉發層,可將日誌轉發到AWS CloudWatch,Fluentd,GELF或NAT伺服器。

使用logging drivers比較簡單,它們需要為每個容器指定,並且將需要在日誌的接收端進行其他配置。

在將日誌發送到ELK的上下文中,使用syslog日誌驅動可能是最簡單的方法。下面是一個指定Logging Driver的例子:

docker run \

 --log-driver=syslog \

 --log-opt syslog-address=tcp://<SyslogServerIP>:5000

 \ --log-opt syslog-facility=daemon

 \ alpine ash

如此這樣運行每一個容器,結果是將Docker容器日誌流輸出到syslog實例,這些日誌將轉發到Logstash容器進行解析和數據增強,進入Elasticsearch。

使用Logspout

Logspout是Docker流行和輕量級的(15.2MB)日誌路由器,它將附加到主機中的所有容器,並將Docker日誌流輸出到syslog伺服器(除非定義了不同的輸出目標)。

sudo docker run -d --name="logspout" --volume=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout syslog+tls://<syslogServerIP>:5000

使用Logstash module直接將日誌路由到Logstash容器,但這需要其他配置和編譯工作。

Logz.io的日誌採集器

本人在<In this blog post>這篇文章中介紹了Logz.io的日誌採集器,像Logspout一樣,它附加在Docker主機中的所有容器上,但它不僅運送Docker日誌,還包含Docker統計信息和Docker守護程序事件。

docker run -d --restart=always -v /var/run/docker.sock:/var/run/docker.sock logzio/logzio-docker -t <YourLogz.ioToken>

目前它是為Logz.io ELK 套件的用戶設計的,我們正在努力將它開源項目。

配置Logstash來解析數據至關重要,因為這部分過程將添加上下文到容器的日誌中,並能夠更輕鬆地分析數據。

在Logstash配置文件中需要配置三個主要部分:輸入,過濾和輸出。 (若運行的是Logstash 5.x,則該文件位於:/ usr / share / logstash / pipeline)

輸入取決於日誌傳送方式,使用Filebeat,則需要指定Beats輸入插件。如果使用logspout或syslog日誌記錄驅動程序,則需要將syslog定義為輸入。

過濾器部分包含用於分解日誌消息的所有過濾器插件,依賴於正在記錄的容器類型以及該特定容器生成的日誌消息。

這部分的配置沒有捷徑,因為每個容器都輸出不同類型的日誌。有很多嘗試和錯誤涉及,但是有一些在線工具可參考, 比如:Grok Debugger.

導出部分將指定Logstash輸出,例子中是Elasticsearch容器。

以下是通過syslog發送的Docker日誌的基本Logstash配置示例。注意一系列過濾器的使用(grok,date,mutate和if條件):

** 此處原始碼顯示不全,請點擊「閱讀原文」查看

重新啟動Logstash容器以應用新的配置。檢查Elasticsearch索引,確保日誌流能正常工作:

curl 'localhost:9200/_cat/indices?v'

具有Logstash模式的索引:

打開Kibana的頁面 

Kibana已經創建了'logstash- *' 索引是標識,按下「創建」按鈕,可在Kibana中看到日誌。

Docker日誌記錄沒有完美的方案,無論選擇什麼解決方案,使用日誌記錄驅動程序,Filebeat還是SaaS監控平臺,每個方案都有優缺點。值得一提的是,Docker日誌很有用,但它們只代表由Docker主機生成的數據的一個維度,檢索容器統計信息和守護程序事件等還需要額外的日誌記錄層。

綜上所述,Logz.io日誌收集器提供了一個全面的日誌解決方案,將三個數據流一起拉到ELK中。如需統計數據,建議嘗試一下Dockerbeat.

本系列的下一部分將重點介紹如何在Kibana中分析和可視化Docker日誌。Docker 生日快樂!

原文連結:https://logz.io/blog/docker-logging/  文中超連結部分請自行查看

Daniel Berman

Logz.io產品經理。擅長日誌分析、大數據、雲計算,熱愛家庭,喜歡跑步,Liverpool FC和寫顛覆性的技術內容。

相關焦點

  • 使用Docker搭建ELK日誌系統
    去elastic官網看一下,果然版本帝就是版本帝,一周一版本。現在我用的版本是基於6.1.1版本的。目標收集Java日誌文件,並且根據文件的不同將日誌分類,比如:訂單日誌,客戶日誌等。日誌文件多行處理總體架構圖2017-12-28-11-23-36準備鏡像6.0之後官方開始自己維護鏡像版本:https://www.docker.elastic.co/。找到需要的ELK鏡像地址,pull下來就好了。
  • 使用ELK處理Docker日誌(二)
    昨天小數分享的使用ELK處理Docker日誌(一)很受歡迎,今天迫不及待的帶來第二篇,側重於分析和可視化,期待給您帶來幫助
  • 用docker快速搭建elk日誌平臺
    在後臺服務數量較多時,登陸機器查看日誌是非常低效的。所以需要一個集中的日誌查看平臺。elk便是為此誕生的。
  • Docker 入門到實戰教程(十二)ELK+Filebeat搭建日誌分析系統
    一個完整的集中式日誌系統,需要包含以下幾個主要特點:收集-能夠採集多種來源的日誌數據 傳輸-能夠穩定的把日誌數據傳輸到中央系統 存儲-如何存儲日誌數據 分析-可以支持 UI 分析 警告-能夠提供錯誤報告,監控機制 ELK提供了一整套解決方案,並且都是開源軟體,之間互相配合使用,完美銜接
  • 小識牛刀:Docker+ELK打造微服務日誌收集平臺
    Elasticsearch可以安裝在本地,也可以作為SaaS使用。Logstash是日誌聚合器,它使用一個pipeline 來接收輸入,過濾數據,並推送日誌輸出。Logstash可以使用不同的輸入插件從不同的源獲取日誌,並以期望的方式推送日誌。Kibana是一個用來可視化Elasticsearch數據的軟體,是一個帶有Elasticsearch的插件。
  • Docker怎麼部署ELK?
    elk集成鏡像,地址:https://hub.docker.com/r/sebp/elk/tags[root@centos-mq ~]# docker pull sebp/elk:660註:660為elk版本2、啟動[root@centos-mq ~]#
  • 使用docker安裝ELK
    yum install docker安裝成功後,使用 docker --versionvm.max_map_count至少需要262144下載鏡像首先啟動dockersystemctl start docker下拉鏡像docker pull sebp/elk
  • Docker實戰之ELK
    ├── kibana│   └── kibana.yml├── logstash│   └── logstash.conf└── zookeeper ├── data └── datalogdocker-compose-elk.yml
  • 一文讀懂開源日誌管理方案 ELK 和 EFK 的區別
    Elasticsearch 指標中的日誌數據ELK 日誌處理流程本次實驗直接使用 Filebeat 作為 Agent,它會收集我們在第一篇《Docker logs & logging driver》中介紹的 json-file 的 log 文件中的記錄變動,並直接將日誌發給 Elasticsearch 進行索引和保存,其處理流程變為下圖,你也可以認為它可以稱作 EFK。
  • ELK 處理 Spring Boot 日誌,妙!
    現今大多採用的微服務架構,日誌被分散在不同的機器上,使得日誌的查詢變得異常困難。工欲善其事,必先利其器。如果此時有一個統一的實時日誌分析平臺,那可謂是雪中送碳,必定能夠提高我們排查線上問題的效率。本文帶您了解一下開源的實時日誌分析平臺 ELK 的搭建及使用。
  • 開源日誌管理方案 ELK 和 EFK 的區別
    本次實驗直接使用 Filebeat 作為 Agent,它會收集我們在第一篇《Docker logs & logging driver》中介紹的 json-file 的 log 文件中的記錄變動,並直接將日誌發給 Elasticsearch 進行索引和保存,其處理流程變為下圖,你也可以認為它可以稱作 EFK。
  • ELK 日誌收集系統
    ELK簡介    在傳統項目中,如果在生產環境中,有多臺不同的伺服器集群,如果生產環境需要通過日誌定位項目的Bug的話,需要在每臺節點上使用傳統的命令方式查詢
  • 初探 ELK - 每天5分鐘玩轉 Docker 容器技術(89)
    Elasticsearch 的設計目標就是要能夠處理和搜索巨量的日誌數據。Logstash讀取原始日誌,並對其進行分析和過濾,然後將其轉發給其他組件(比如 Elasticsearch)進行索引或存儲。Logstash 支持豐富的 Input 和 Output 類型,能夠處理各種應用的日誌。
  • ELK logstash 處理MySQL慢查詢日誌
    在生產環境下,logstash 經常會遇到處理多種格式的日誌
  • Docker 搭建 ELK 日誌搜索平臺
    ELK 搭建流程1、規範化 Spring Boot 應用的日誌請參考 《Spring Boot Log4j2 日誌性能之巔》,此處為了收集、處理日誌信息,所以修改下日誌的 Pattern,將<Property
  • ELK日誌平臺:安裝配置搭建(1)
    ELK日誌平臺介紹在搜索ELK資料的時候,發現這篇文章比較好,於是摘抄一小段:日誌主要包括系統日誌
  • ELK 是什麼?一文全面了解 ELK Stack 企業級日誌平臺
    一、ELK Stack概述官方話:ELK一款輕量級的實時日誌收集,處理,展示系統。二、ELK Stack架構ELK是Elasticsearch、Logstash、Kibana三個開源軟體的組合而成,形成一款強大的實時日誌收集展示系統
  • Kubernetes實戰之部署ELK Stack收集平臺日誌
    市面上很多開發只要提到ELK能夠一致說出它是一個日誌分析架構技術棧總稱,但實際上ELK不僅僅適用於日誌分析,它還可以支持其它任何數據分析和收集的場景,日誌分析和收集只是更具有代表性。並非唯一性。我們本教程主要也是圍繞通過ELK如何搭建一個生產級的日誌分析平臺來講解ELK的使用。
  • 【Docker系列】認識ELK,docker安裝ELK和IK分詞器
    新增了一個FileBeat,它是一個輕量級的日誌收集處理工具(Agent),Filebeat佔用資源少,適合於在各個伺服器上搜集日誌後傳輸給Logstash,官方也推薦此工具。Elasticsearch是個開源分布式搜尋引擎,提供搜集、分析、存儲數據三大功能。它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。
  • ELK Stack 企業級日誌平臺
    一、ELK Stack概述官方話:ELK一款輕量級的實時日誌收集,處理