摘要:編者的話產品經理為了紀念四歲生日,撰寫一系列文章,介紹如何使用收集和處理環境日志。在將日志發送到的上下文中,使用日志驅動可能是最簡單的方法。如果使用或日志記錄驅動程序,則需要將定義為輸入。
[編者的話] Daniel Berman ( Logz.io 產品經理)為了紀念 Docker 四歲生日,撰寫一系列文章,介紹如何使用 ELK 收集和處理 Dockerized 環境日志。小數今天給大家帶來的第一部分將介紹如何安裝各個組件以及不同日志收集方案的特點,下一部分將側重于分析和可視化,近期發出,記得關注我們噢~
PS :數人云工程師們已奔赴奧斯汀 DockerCON2017 現場,更多最佳實踐后天為您奉上!
容器運行程序時產生的日志具有“無常,分布,隔離”等特點,因此在架構中收集 Docker 日志面臨很大的挑戰,有待嘗試一種強有力的日志收集和處理方案來解決此類復雜問題。
ELK ( Elasticsearch , Logstash 和 Kibana )是處理容器日志的一種方式,盡管設置 ELK 工作流并不容易(難度取決于環境規格),但最終可以使用 Kibana 的監控面板來展示 Docker 日志:
.
為了紀念 Docker 四歲生日,我們將撰寫一系列文章,介紹如何使用 ELK 收集和處理 Dockerized 環境日志。第一部分將介紹如何安裝各個組件以及不同日志收集方案的特點,并建立從容器中收集日志的工作流,下一部分將側重于分析和可視化。
日志收集的流程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
To run the stack:
運行如下命令:
git clone https://github.com/deviantony/docker-elk.git cd docker-elk docker-compose up
正常情況下, ELK 套件的三個服務(Elasticsearch, Logstash, Kibana)會啟動成功,默認持久化數據目錄 /var/lib/elasticsearch (Elasticsearch 的數據存儲目錄)
sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73aedc3939ad dockerelk_kibana "/bin/sh -c /usr/l..." 7 minutes ago Up 6 minutes 0.0.0.0:5601->5601/tcp dockerelk_kibana_1 b684045be3d6 dockerelk_logstash "logstash -f /usr/..." 7 minutes ago Up 6 minutes 0.0.0.0:5000->5000/tcp dockerelk_logstash_1 a5778b8e4e6a dockerelk_elasticsearch "/bin/bash bin/es-..." 7 minutes ago Up 7 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp dockerelk_elasticsearch_1測試安裝組件
可通過如下的方式來確保所有組件都能正常運行。
首先嘗試訪問 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安裝組件比較簡單,相比而言將 Docker 日志發送到 ELK 有點復雜,這取決于輸出日志的方式。
如果沒有額外指定,容器的 stdout 和 stderr 輸出(也稱為“ docker logs ”)輸出到 JSON 文件。所以,如果是一個小型 Docker 環境,使用 Filebeat 來收集日志將是不錯的選擇。但如果使用其他日志記錄驅動程序,則可能需要考慮其他方法。
以下是將日志導入 ELK 的三種不同的方法,切記,這并不能包含所有的方案。
使用 FilebeatFilebeat 屬于 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/使用日志驅動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://:5000 --log-opt syslog-facility=daemon alpine ash
如此這樣運行每一個容器,結果是將 Docker 容器日志流輸出到 syslog 實例,這些日志將轉發到 Logstash 容器進行解析和數據增強,進入 Elasticsearch 。
使用 LogspoutLogspout 是 Docker 流行和輕量級的( 15.2MB )日志路由器,它將附加到主機中的所有容器,并將 Docker 日志流輸出到 syslog 服務器(除非定義了不同的輸出目標)。
sudo docker run -d --name="logspout" --volume=/var/run/docker.sock:/var/run/docker.sock gliderlabs/logspout syslog+tls://: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
目前它是為 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 條件):
input { syslog { port => 5000 type => "docker" } } filter { grok { match => { "message" => "%{SYSLOG5424PRI}%{NONNEGINT:ver} +(?:%{TIMESTAMP_ISO8601:ts}|-) +(?:%{HOSTNAME:service}|-) +(?:%{NOTSPACE:containerName}|-) +(?:%{NOTSPACE:proc}|-) +(?:%{WORD:msgid}|-) +(?:%{SYSLOG5424SD:sd}|-|) +%{GREEDYDATA:msg}" } } syslog_pri { } date { match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } mutate { remove_field => [ "message", "priority", "ts", "severity", "facility", "facility_label", "severity_label", "syslog5424_pri", "proc", "syslog_severity_code", "syslog_facility_code", "syslog_facility", "syslog_severity", "syslog_hostname", "syslog_message", "syslog_timestamp", "ver" ] } mutate { remove_tag => [ "_grokparsefailure_sysloginput" ] } mutate { gsub => [ "service", "[0123456789-]", "" ] } if [msg] =~ "^ *{" { json { source => "msg" } if "_jsonparsefailure" in [tags] { drop {} } mutate { remove_field => [ "msg" ] } } } output { elasticsearch { hosts => "elasticsearch:9200" } }
重新啟動 Logstash 容器以應用新的配置。檢查 Elasticsearch 索引,確保日志流能正常工作:
curl "localhost:9200/_cat/indices?v"
具有 Logstash 模式的索引:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open logstash-2017.03.05 kgJ0P6jmQjOLNTSmnxsZWQ 5 1 3 0 10.1kb 10.1kb yellow open .kibana 09NHQ-TnQQmRBnVE2Y93Kw 1 1 1 0 3.2kb 3.2kb
打開 Kibana 的頁面
Kibana 已經創建了"logstash- *" 索引是標識,按下“創建”按鈕,可在 Kibana 中看到日志。
結語Docker 日志記錄沒有完美的方案,無論選擇什么解決方案,使用日志記錄驅動程序, Filebeat 還是 SaaS 監控平臺,每個方案都有優缺點。
值得一提的是, Docker 日志很有用,但它們只代表由 Docker 主機生成的數據的一個維度,檢索容器統計信息和守護程序事件等還需要額外的日志記錄層。
綜上所述, Logz.io 日志收集器提供了一個全面的日志解決方案,將三個數據流一起拉到 ELK 中。如需統計數據,建議嘗試一下 Dockerbeat.
本系列的下一部分將重點介紹如何在 Kibana 中分析和可視化 Docker 日志。
Docker 生日快樂!
Daniel Berman 是 Logz.io 產品經理。擅長日志分析、大數據、云計算,熱愛家庭,喜歡跑步,Liverpool FC 和寫顛覆性的技術內容。
原文鏈接: https://logz.io/blog/docker-l...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26851.html
摘要:環境要求由,和容器組成使用日志收集器將日志發送到。若使用自己的部署,分析和可視化日志的概念保持不變。日志可視化以索引數據為基礎創建豐富的可視化和儀表板的能力而聞名,事實上,得到這些數據并不容易。 昨天小數分享的使用ELK處理Docker日志(一)很受歡迎,今天迫不及待的帶來第二篇,側重于分析和可視化,期待給您帶來幫助:) 噓,聽說數人云工程師們在奧斯汀DockerCON2017買了D...
摘要:數據導入與校驗容器運行之后,筆者需要驗證是否啟動成功,可以通過瀏覽器訪問和的頁面是否成功來判斷。的整體操作流程比較簡單,首先是收集各種日志并進行過濾,然后將過濾后的內容發送到服務中,最后用戶通過的頁面查看中的日志數據作者湯青松微信日期 一、背景 筆者所在項目組的項目由多個子項目所組成,每一個子項目都存在一定的日志,有時候想排查一些問題,需要到各個地方去查看,極為不方便,此前聽說有ELK...
摘要:數據導入與校驗容器運行之后,筆者需要驗證是否啟動成功,可以通過瀏覽器訪問和的頁面是否成功來判斷。的整體操作流程比較簡單,首先是收集各種日志并進行過濾,然后將過濾后的內容發送到服務中,最后用戶通過的頁面查看中的日志數據作者湯青松微信日期 一、背景 筆者所在項目組的項目由多個子項目所組成,每一個子項目都存在一定的日志,有時候想排查一些問題,需要到各個地方去查看,極為不方便,此前聽說有ELK...
摘要:數據導入與校驗容器運行之后,筆者需要驗證是否啟動成功,可以通過瀏覽器訪問和的頁面是否成功來判斷。的整體操作流程比較簡單,首先是收集各種日志并進行過濾,然后將過濾后的內容發送到服務中,最后用戶通過的頁面查看中的日志數據作者湯青松微信日期 一、背景 筆者所在項目組的項目由多個子項目所組成,每一個子項目都存在一定的日志,有時候想排查一些問題,需要到各個地方去查看,極為不方便,此前聽說有ELK...
摘要:在中默認開啟端口用于偵聽發送過來的日志報文。至此,在中如何部署一套完整系統已經介紹完了,下面我將介紹如何將容器日志發送到中。下面我將介紹如何收集容器日志。目前日志顯的雜亂無序。,現在我們再去查看發現我們的容器日志已經展示在這里了。 相信大家對于容器和 docker 這個概念并不陌生,很高興的是 docker 為我們提供了多種log-driver。 showImg(https://se...
閱讀 1653·2021-11-23 09:51
閱讀 2677·2021-11-22 09:34
閱讀 1316·2021-10-14 09:43
閱讀 3661·2021-09-08 09:36
閱讀 3206·2019-08-30 12:57
閱讀 2025·2019-08-30 12:44
閱讀 2516·2019-08-29 17:15
閱讀 3014·2019-08-29 16:08