容器內日誌收集方案示例
容器內日誌收集方案示例
ELK(Elasticsearch+Logstash+Kibana)是流行的一體化日誌方案,提供日誌收集、處理、存儲、搜索、展示等全方位功能。
基於docker部署ELK非常方便,有各種現成的image可用,比如https://elk-docker.readthedocs.org/
但因為容器的隔離性,收集容器內的日誌很不方便。本文的方案可以讓用戶通過簡單的配置實現這一功能。
原理
本方案借助docker的Volume功能。在host機器上開辟一個固定目錄D;產生日誌的容器將日誌文件所在目錄mount到D目錄下的子目錄中;收集日誌的容器再把目錄D mount到自己容器內。
這樣日誌收集容器就能訪問到所有日誌文件了。如下圖所示:
另外,為了收集容器的stdout、stderr日誌,還需要將host的/var/lib/docker/目錄mount到日誌收集容器中,可以收集到json日誌。
部署方法
可以通過下麵這個容器編排文件實現一鍵部署。
#elk包含了Elasticsearch+Logstash+Kibana三個應用
elk:
image: registry.aliyuncs.com/testhub/elk:0.1
ports:
- '5601:5601'
- '9200:9200'
- '5000:5000'
restart: always
labels:
#aliyun.logs標示需要收集的目錄,沒有該標識的容器不會收集日誌。多個目錄之間用分號;分隔,目錄與文件pattern之間用冒號:分隔,不帶pattern則收集目錄下所有文件。
#下麵這行表示收集/var/log/elasticsearch目錄下所有文件,/var/log/test/目錄下所有.txt文件。
aliyun.logs: /var/log/elasticsearch;/var/log/test/:*.txt
#aliyun.logs裏出現的每一個目錄,都要有相應的volume。
#host目錄必須是/container_logs/開頭。
volumes:
- /container_logs/elasticsearch/:/var/log/elasticsearch/
- /container_logs/elktest/:/var/log/test/
logstash-forwarder:
image: registry.aliyuncs.com/testhub/logstash-forwarder:0.2
restart: always
links:
- elk:logstash
labels:
#aliyun.global: true是阿裏雲擴展的功能,有該標識的容器每個host上有且僅有一個
aliyun.global: 'true'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /container_logs/:/container_logs/
- /var/lib/docker/:/var/lib/docker/
部署教程
在這之前,需要先創建一個集群。可以在容器服務控製台https://cs.console.aliyun.com/ 完成。
1. 創建編排文件
4. 訪問https://節點IP:5601/,開始搜索日誌
最後更新:2017-04-01 13:51:26