仓库源文站点原文


title: "使用 Docker 搭建 EFK" date: 2019-03-14T21:58:00+08:00 tags: ["架构"] draft: false

toc: true

什么是 EFK?

EFK 分别指 Elasticsearch + Fluentd + Kibana,一般用来做日志系统的。他们的作用分别是:

<!--more-->

随着公司的项目、集群越来越多,统一的日志管理系统是必不可少的。

下面我就分享一下我今天搭建的过程和踩过的坑。

安装

自从用过 Docker 之后,只要能用 Docker 的我都用 Docker,能省不少精力和时间,那么安装 EFK 也少,我第一想到的就是去 Google 搜索『Docker efk』,然后找到这个项目 alextanhongpin/docker-efk,按着下面的命令执行就能安装成功:

git clone https://github.com/alextanhongpin/docker-efk.git
cd docker-efk
docker-compose up -d elasticsearch fluentd kibana

以上三条命令就搭建成功了,方不方便?另外我还想说:

测试

本机测试

docker run --rm --log-driver=fluentd ubuntu /bin/echo 'Hello world'
pip install pyfluent
vim test-efk.py

写入代码:

# !/usr/bin/env python
# -*- coding: utf-8 -*-
from pyfluent.client import FluentSender
fluent = FluentSender() # 默认使用 location 和 24224 端口连接 fluentd
fluent.send('Hello pyfluent!')

然后运行

python test-efk.py

docker 测试

现在的场景是另一个项目在本机的另一个 Docker (下文称 a-docker)里面请求 Fluentd 写入日志,今天这个问题搞了半天都没写入,发现 fluentd 一直是没接收到,也就是说 a-docker 一直没连接到 efk-docker,也就是说:

所以我们可以简单粗暴的这样解决:

ports:
    - 0.0.0.0:24224:24224
    - 0.0.0.0:24224:24224/udp

更好的解决方案:

待补充……

为 Fluentd 配置动态 tag

项目之间的日志如何区分?当然是修改 fluentd.conf 配置文件的 logstash_prefix 来区分,除了为每一个项目手动添加一个 store 配置项的笨方式外,我们还可以通过动态的方式来实现动态标签功能,我修改之后的配置文件如下:

<source>
  @type forward
  port  24224
  bind 0.0.0.0
</source>

<filter **.**>
  @type record_transformer
  enable_ruby
  <record>
    tag ${tag}
  </record>
</filter>

# Store data in Elasticsearch
<match *.**>
  @type copy
  <store>
    @type elasticsearch_dynamic
    host docker.for.mac.localhost
    port 9200
    # type_name fluentd
    logstash_format true
    logstash_prefix ${record["tag"]}
    # logstash_prefix fluentd
    # include_tag_key true
    include_tag_key false
    type_name access_log
    tag_key @log_name
  </store>
  <store>
    @type stdout
  </store>
</match>

最后

总结一下本篇文章,主要介绍: