环境说明:

主机名 操作系统版本 IP地址 docker版本 Vmware版本
docker01 Ubuntu 16.04.5 172.27.9.71 18.09.2 12.5.2

ubuntu安装详见:Ubuntu16.04.5以lvm方式安装全记录
docker安装详见:Ubuntu16.04安装Docker
docker-compose安装详见:Docker Compose实践

一、ELK

在介绍EFK之前先介绍下ELK

1. ELK简介

Logstash
Logstash: 是一个灵活的数据传输和处理系统,Logstash的任务读取原始日志,并对其进行分析和过滤,然后将其转发给其他组件(比如 Elasticsearch)进行索引或存储。在beats出来之前,还负责进行数据收集。logstash基于JRuby实现,可以跨平台运行在JVM上。模块化设计,有很强的扩展性和互操作性,不过性能一直是被诟病的问题。
 
Elasticsearch
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
 
Kibana
Kibana可以为 Logstash、Beats和ElasticSearch提供的日志分析友好的Web界面,可以帮助汇总、分析和搜索重要数据日志。

2. ELK日志处理流程

Docker实践(七): EFK Stack搭建日志管理系统_第1张图片

二、Fluentd

1. Fluentd简介

Fluentd是一个免费和开源的日志收集器,目前支持超过600种输入源,可以连接各种数据源和数据输出组件。fluentd基于CRuby实现,并对性能表现关键的一些组件用C语言重新实现,整体性能不错。Fluentd有很强的的扩展性,最大支持超过500000台服务器。
本文使用Fluentd替换Logstash搭建EFK日志管理系统。

Docker实践(七): EFK Stack搭建日志管理系统_第2张图片
Fluentd特点:

  • 安装方便
  • 占用空间小
  • 半结构化数据日志记录
  • 灵活的插件机制
  • 可靠的缓冲
  • 日志转发

2. Fluentd日志处理流程

Docker实践(七): EFK Stack搭建日志管理系统_第3张图片

三、日志管理系统搭建

本文采用Docker Compose方式搭建EFK Stack

1. 目录结构

root@docker01:~# tree efk/
efk/
├── docker-compose.yml
└── fluentd
    ├── conf
    │   └── fluent.conf
    └── Dockerfile

2 directories, 3 files

新建项目目录efk

2. docker-compose.yml

root@docker01:~/efk# more docker-compose.yml 
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:5.3.0
    expose:
      - 9200
    ports:
      - "9200:9200"

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

该yml用于创建服务Apache、Fluentd、Elasticsearch和Kibana,创建的web容器指定的Logging Driver为fluentd
注意, 镜像Elasticsearch和Kibana版本需保持一致

3. Fluentd镜像

root@docker01:~/efk/fluentd# more Dockerfile 
# fluentd/Dockerfile
FROM fluent/fluentd:v0.12-debian
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.9.7"]

准备Fluentd镜像,安装Elasticsearch plugin,通过插件fluent-plugin-elasticsearch可以直接将日志发送给 Elasticsearch

4. fluent.conf

root@docker01:~/efk/fluentd/conf# more fluent.conf 
# fluentd/conf/fluent.conf

  @type forward
  port 24224
  bind 0.0.0.0


  @type copy
  
    @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
  
  
    @type stdout
  

在Fluentd中,配置文件非常重要,它定义了Fluentd应该执行的操作。
source:定义输入。type指定使用的input plugin,这里是in_forward,用于接收来自Docker logging driver即fluentd的日志。
match:定义输出的目标,如写入文件,或者发送到指定地点。out_elasticsearch插件用于将日志转发到elasticsearch。
Fluentd有6种插件: Input, Parser, Filter, Output, Formatter and Buffer。具体可参考:https://docs.fluentd.org/v0.12/articles/input-plugin-overview

5. 启动容器

root@docker01:~/efk# docker-compose up

Docker实践(七): EFK Stack搭建日志管理系统_第4张图片

6. 查看容器

Docker实践(七): EFK Stack搭建日志管理系统

7. 产生httpd Access Logs

root@docker01:~# for i in {1..10};do sleep 1; curl http://172.27.9.71:80; done   

It works!

It works!

It works!

It works!

It works!

It works!

It works!

It works!

It works!

It works!

8. 配置Kibana

8.1 访问Kibana

http://172.27.9.71:5601/app/kibana
Docker实践(七): EFK Stack搭建日志管理系统_第5张图片

8.2 查看日志索引

http://172.27.9.71:9200/_search?pretty
Docker实践(七): EFK Stack搭建日志管理系统_第6张图片

8.3 配置index pattern

Docker实践(七): EFK Stack搭建日志管理系统_第7张图片
指定index pattern为fluentd-*,这与Elasticsearch中的index一致,Time-field name选择 @timestamp,点击Create创建index pattern。

8.4 日志发现

Docker实践(七): EFK Stack搭建日志管理系统_第8张图片