前言      

       本文介绍如何将Docker日志收集到EFK(Elasticsearch + Fluentd + Kibana)的stack,该示例使用Docker Compose设置多个容器。

EFK(Elasticsearch + Fluentd + Kibana)方式进行Docker日志收集、检索展示_EFK

        Elasticsearch是一个以易用性着称的开源搜索引擎。Kibana是一个开源的Web UI,使Elasticsearch对工程师和数据科学家都很友好。

       通过结合这三个工具EFK(Elasticsearch + Fluentd + Kibana),我们可以获得可扩展,灵活,易用的日志收集和分析。在本文中,我们将设置4个容器,每个容器包括:

httpd的所有日志都会通过Fluentd被收集到Elasticsearch 。

 

先决条件:Docker

请下载并安装Docker / Docker Compose。

 

第1步:准备docker-compose.yml

        首先,为Docker Compose准备docker-compose.yml文件。Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。

        使用下面的YAML文件,您可以通过一个命令创建和启动所有容器服务(在本例中为Apache,Fluentd,Elasticsearch,Kibana)。

version: '2'
services:
  web:
    image: httpd
    ports:
      - "80:80"
    links:
      - fluentd
    logging:
      driver: "fluentd"
      options:
        fluentd-address: localhost:24224
        tag: httpd.access

  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
    links:
      - "elasticsearch"
    ports:
      - "24224:24224"
      - "24224:24224/udp"

  elasticsearch:
    image: elasticsearch
    expose:
      - 9200
    ports:
      - "9200:9200"

  kibana:
    image: kibana
    links:
      - "elasticsearch"
    ports:
      - "5601:5601"

logging标签(参考Docker Compose文档)是容器web指定Docker Fluentd Logging Driver作为容器日志收集的驱动。web容器中的所有日志都将自动转发到fluentd-address指定设置的地址

 

第2步:准备Fluentd镜像和Elasticsearch插件

    准备下面内容作为fluentd/Dockerfile,使用Fluentd的官方Docker镜像,并另外安装Elasticsearch插件。

#fluentd / Dockerfile 
FROM fluent / fluentd:v0.12-debian 
RUN [“gem”,“install”,“fluent-plugin-elasticsearch”,“ -  no-rdoc”,“ -  no-ri”,“ - -version“,”1.9.2“]

然后,准备Fluentd的配置文件fluentd/conf/fluent.conf。

# fluentd/conf/fluent.conf
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
<match *.**>
  @type copy
  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 1s
  </store>
  <store>
    @type stdout
  </store>
</match>

第3步:启动容器

   仅仅需要一个命令来启动所有容器。

$ docker-compose up

docker ps命令检查4个容器是否正在运行。

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                                          NAMES
2d28323d77a3        httpd                      "httpd-foreground"       About an hour ago   Up 43 seconds       0.0.0.0:80->80/tcp                                             dockercomposeefk_web_1
a1b15a7210f6        dockercomposeefk_fluentd   "/bin/sh -c 'exec ..."   About an hour ago   Up 45 seconds       5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp   dockercomposeefk_fluentd_1
01e43b191cc1        kibana                     "/docker-entrypoin..."   About an hour ago   Up 45 seconds       0.0.0.0:5601->5601/tcp                                         dockercomposeefk_kibana_1
b7b439415898        elasticsearch              "/docker-entrypoin..."   About an hour ago   Up 50 seconds       0.0.0.0:9200->9200/tcp, 9300/tcp                               dockercomposeefk_elasticsearch_1

第4步:产生容器httpd访问日志

让我们访问httpd来生成一些访问日志。

$ repeat 10 curl http:// localhost:80 /
 <html> <body> <h1>它有效!</ h1> </ body> </ html>
 <html> <body> <h1>它有效!</ h1> </ body> </ html>
 <html> <body> <h1>它有效!</ h1> </ body> </ html>
 <html> <body> <h1>它有效!</ h1> </ body> </ html>
 <html> <body> <h1>它有效!</ h1> </ body> </ html>
 <html> <body> <h1>它有效!</ h1> </ body> </ html>
 <html> <body> <h1>它有效!</ h1> </ body> </ html>
 <html> <body> <h1>它有效!</ h1> </ body> </ html>
 <html> <body> <h1>它有效!</ h1>
</ body> </ html> <html> <body> <h1>它有效!</ h1> </ body> </ html>

第5步:通过Kibana查看日志

      在你的浏览器中访问http://localhost:5601/,然后为Kibana设置匹配的索引名,请使用fluentd-*作为索引名,并点击“Create”按钮。

EFK(Elasticsearch + Fluentd + Kibana)方式进行Docker日志收集、检索展示_docker_02

然后,去Discover页面选项卡查看日志。 正如你看见的,通过Fluentd将日志正确的收集到Elasticsearch + Kibana中。

EFK(Elasticsearch + Fluentd + Kibana)方式进行Docker日志收集、检索展示_docker_03

结论 

      本文介绍如何从Apache HTTP Server收集日志到EFK(Elasticsearch + Fluentd + Kibana)。提供的示例代码脚本:https://github.com/kzk/docker-compose-efk

 

原文:https://docs.fluentd.org/v0.12/articles/docker-logging-efk-compose