B i M A P

ELK|Managing Docker Logs to ELK Stack

ELK Logo

Elasticsearch Version: 7.10.1

Docker Engine Version: 20.10.7


Setting Docker Logging

Docker 預設使用 json-file 的方式,將 container 的 log 以 json 的方式做暫存在系統中。

我們可以覆寫 logging 的設定,這邊以修改 gelf 的為例,所以:

version: "3" 
services:
frontend:
build: ./your-project
restart: always
ports:
- 4000:80
logging:
driver: gelf
options:
gelf-address: "udp://172.16.0.7:12201"
tag: "tcbank_backend"


Setting Logstash Pipeline

此時,Docker 將 log 以 gelf 格式,發送至 Logstash,並將實際的 log 置於 message key 中,可以試著透過 Grok 進一步解析,以利後面的 Dashboard 製作。

所以我們可以開始寫 Logstash 接收 Docker Log 並送至 Elasticsearch,所以:

input { 
gelf {
port => 12201
}
}
filter {
grok {
match => {"message" => [
"%{LOGLEVEL:log_level}:%{SPACE}%{HOSTNAME:hostname}:%{POSINT:port}%{SPACE}-%{SPACE}\"%{WORD:method}%{SPACE}%{URIPATH:path}%{URIPARAM:params}%{SPACE}%{NOTSPACE:schema}\"%{SPACE}%{NUMBER:status_code}%{SPACE}%{GREEDYDATA:result}",
"%{LOGLEVEL:log_level}:%{SPACE}%{HOSTNAME:hostname}:%{POSINT:port}%{SPACE}-%{SPACE}\"%{WORD:method}%{SPACE}%{URIPATH:path}%{SPACE}%{NOTSPACE:schema}\"%{SPACE}%{NUMBER:status_code}%{SPACE}%{GREEDYDATA:result}"
]}
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => ["http://10.99.1.138:9200"]
index => "%{[tag]}-%{+YYYY.MM.dd}"
}
}


Kibana Discover

我們已經可以在 Elasticsearch 接收到 Logstash 送進來的 Log。

還需要建立 index pattern,才可在 discover 查看,所以:

kibana create index pattern

kibana discover


Visualize Data

這邊主要根據個人需求規劃想要看的 Visualize,以利後面的 Dashboard 組合。

在我們的例子中需要:

  • 2 個 Metrics,針對 source_host、image_name 的數量,分別各建立 1 個 Metric。
  • 1 個 Gauge,使用 message 中 grok 出來的 status code,分別看除了 200 以外是否有其他的錯誤代碼。
  • 1 個 Vertical Bar,使用 message 中 grok 出來的 api endpoint,count api 存取次數。
  • 1 個 Datatable,查看 log 的一些詳細資訊,比如 message,endpoint 等等。

以 Datatable 為例子(如右圖),因為我們在 Logstash 中有透過 grok 進一步解析欄位,所以在這裡就可以切三個欄位,可以方便我們看到 API Endpoint,跟一些訊息。

Kibana Visualize

Kibana Visualize Datatable


Kibana Dashboard

我們可以至 Dashboard,選擇剛剛建立的 Visualize,組合成您滿意的儀表版,所以:

Kibana Dashboard add Visualize


Conclusion

  1. 覆寫 docker logging 設定 driver 為 gelf
  2. logstash 接收 log,透過 gork 解析,並傳送至 elasticsearch
  3. 建立 index pattern,並至 discover 查看 log
  4. 根據 grok 的內容,建立多個 visualize 
  5. 組合 visualize 成最後的 dashboard



有任何問題,或是想看新主題? 聯絡我們

延伸閱讀
winstonlu的大頭照
ELK 達人

我們致力於 ELK 的各種應用,協助企業建置相關服務。我們也提供基於 ELK 的各種解決方案,有任何問題,歡迎加入我們的官方 Line,或來信詢問,期待與您面對面的機會。