前言
通常在使用容器部署應用,特别是借助
Kubernetes
雲平台管理及部署應用時,需要收集各個應用的控制台标準輸出及日志檔案,統一輸出到
Elasticsearch
,并由
Kibana
進行可視化展示。
其中一個方案是使用
log-pilot
進行容器日志收集,并輸出到
Elasticsearch
。
log-pilot
是由阿裡雲提供,但是從其GitHub代碼倉庫的送出記錄可以看出,目前已經處于停止維護的狀态,其支援的
Elasticsearch
版本也隻到
6.x
,對于較新的版本
7.x
,從實驗結果看是不支援的。
是以本文将使用
Elasticsearch
的
6.8.18
版本進行安裝實驗,關于
Elasticsearch
的安裝步驟,請參考另一篇博文。
下載下傳鏡像
docker pull registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-filebeat
建立log-pilot容器
docker run -it --name log-pilot \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /:/host \
--privileged \
-e PILOT_LOG_PREFIX=test \
-e FLUENTD_OUTPUT=elasticsearch \
-e LOGGING_OUTPUT=elasticsearch \
-e ELASTICSEARCH_HOSTS=192.168.3.201:9200 \
registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-filebeat
我們注意到,這裡配置了三個環境變量,說明如下:
-
設定日志配置的字首,将在後面測試容器建立時使用PILOT_LOG_PREFIX=test
-
把日志發送到ElasticsearchFLUENTD_OUTPUT=elasticsearch
-
Elasticsearch的位址及端口号ELASTICSEARCH_HOSTS=192.168.3.201:9200
可以看到容器輸出日志:
enable pilot: filebeat
DEBU[0000] 05cc29a5c788593d72a28cb6ac9c28137014c5843888df1bac0fa49e4d0dae07 has not log config, skip
INFO[0000] starting filebeat
INFO[0000] filebeat started: 21
INFO[0000] filebeat watcher start
INFO[0000] Reload gorouting is ready
建立測試容器
我們分别建立
Tomcat
和
Nginx
容器,來測試
log-pilot
分别對标準輸出及日志檔案的收集。
Tomcat容器
docker run -it --name tomcat --rm -p 18080:8080 \
-v /usr/local/tomcat/logs \
--label test.logs.tomcat_catalina=stdout \
--label test.logs.tomcat_access=/usr/local/tomcat/logs/localhost_access_log.*.txt \
tomcat
注意這裡的
--label
參數分别配置了
test.logs.tomcat_catalina
、
test.logs.tomcat_access
,其中的test就是上文通過
PILOT_LOG_PREFIX
環境變量指定的值。
stdout
是特殊值,表示标準輸出,
test.logs.tomcat_catalina
這個配置表示将收集容器的标準輸出。另一個
test.logs.tomcat_access
配置将收集容器對應路徑下的日志檔案。
接下來通過浏覽器通路
http://192.168.3.201:18080/
位址,雖然我們會看到404錯誤,但是我們會看到容器裡的localhost_access_log.txt檔案将輸出響應的資訊。
log-pilot
将收集這個檔案的内容,并輸出到
Elasticsearch
。
建立index pattern
通路
Kibana
頁面,在
Management
-
Index Patterns
菜單中可以看到,已經看到了我們配置的Index。
在Index pattern中填寫
tomcat_access*
,并點選下一步。
選擇@timestamp域,完成index pattern的建立。
檢視
Discover
菜單,并選擇我們建立的
tomcat_access*
過濾器,可以看到Tomcat的通路日志。
Nginx容器
docker run --name nginx --rm -p 80:80 \
-v /var/log/nginx \
--label test.logs.nginx=stdout \
docker.io/nginx:1.21.3
同樣的,這裡配置
--label test.logs.nginx=stdout
來收集nginx的控制台輸出。
通路
http://192.168.3.201/
,可以看到容器背景輸出了類似的日志内容:
在
log-pilot
的背景也輸出了收集到的日志:
接着我們在Kibana上建立nginx的
index pattern
,使用nginx*作為條件。
回到
Discover
菜單,将過濾條件切換為nginx*,将看到nginx的控制台日志輸出。
總結
至此,通過
log-pilot
進行容器控制台及日志檔案的内容收集,并輸出到
Elasticsearch
的實驗就結束了,特别需要說明的是,docker的版本在開始的階段使用的
1.13
版本,滿足官網的安裝條件,但是發現不能成功,将docker版本更換為
1.20
後,得到了我們想要的結果。