在用戶根目錄創建個filebeat.docker.yml文件,文件內容如下
filebeat.config: modules: path: ${path.config}/modules.d/*.yml reload.enabled: false filebeat.autodiscover: providers: - type: docker templates: - condition: contains: docker.container.labels.collectLog: "true" config: - type: container paths: - /var/lib/docker/containers/${data.docker.container.id}/*.log processors: - add_cloud_metadata: ~ output.elasticsearch: hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}' username: '${ELASTICSEARCH_USERNAME:}' password: '${ELASTICSEARCH_PASSWORD:}'
其中templates的condition里表示的是收集labels里有collectLog: "true"的容器的日志
通過docker-compose安裝es filebeat kibana。(PS:這個單節點的efk,集群高可用的話一般還需要搭配隊列,redis或者kafka。而且es一般也是集群,filebeat是每個節點一個,那樣的話就得用k8s才方便了)
version: "3" services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0 container_name: es environment: - discovery.type=single-node ports: - 9200:9200 - 9300:9300 kibana: image: docker.elastic.co/kibana/kibana:7.8.0 container_name: kibana ports: - 5601:5601 filebeat: image: docker.elastic.co/beats/filebeat:7.8.0 container_name: filebeat environment: - output.elasticsearch.hosts=["elasticsearch:9200"] user: root volumes: - "~/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" - "/var/lib/docker/containers:/var/lib/docker/containers:ro" - "/var/run/docker.sock:/var/run/docker.sock:ro"
然后啟動一個容器,labels里有collectLog: "true"就行.
這里我以一個asp.net core服務為例,docker-compose.yml如下,鏡像和服務名改為你自己的即可。
version: "3" services: xx_api: container_name: xx_api image: registry.cn-beijing.aliyuncs.com/xx/xx3api:latest labels: collectLog: "true" ports: - 9005:80
最后在kibana顯示日志。
打開kibana的站點,點擊Management
然后點擊Kibana的Index Patterns, 再點創建索引樣式
輸入filebeat*,點擊下一步
然后選個模式,我選的是timestamp的。這樣就創建索引了。
回到主頁,點擊logs
就可以看到日志成功顯示出來了。