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 查看,所以:
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 Dashboard
我們可以至 Dashboard,選擇剛剛建立的 Visualize,組合成您滿意的儀表版,所以:
Conclusion
- 覆寫 docker logging 設定 driver 為 gelf
- logstash 接收 log,透過 gork 解析,並傳送至 elasticsearch
- 建立 index pattern,並至 discover 查看 log
- 根據 grok 的內容,建立多個 visualize
- 組合 visualize 成最後的 dashboard
有任何問題,或是想看新主題?
聯絡我們