开始使用Fluentd

关于Fluentd

总结

Fluentd是一种(开源)数据收集和转发工具。

fluentd 是一个日志聚合软件。

这次我们使用Docker进行了运营实验。

验证1. 验证fluentd的运行情况

翻译:目标

使用应用服务器和Fluentd服务器来验证Fluentd的功能。

文件结构

|-- bottle_app
|      |-- app
|           |-- main.py   <- メイン
|           |-- bottle.py
|           |-- views      <- htmlファイル群
|
|-- fluentd
       |-- config
            |-- fluent.conf
应用服务器

使用Python的Bottle框架创建一个简单的Web服务器。

主函数.py

# coding: utf-8
from bottle import template, route, run, request
import urllib

# htmlファイルを返す関数
@route('/')
def login():
    print("test")
    return template('text_login')

# postされた情報を加えたhtmlファイルを返す関数
@route('/text_check', method='post')
def check():
    username = request.forms.get('username')
    email = request.forms.get('email')

    return template('text_check.html', username=username, email=email)

run(host='0.0.0.0', port=8080, debug=True)

执行

docker run -it --rm --name my-app -v "$PWD":/usr/src/myapp -w /usr/src/myapp -p 8080:8080 --log-driver=fluentd --log-opt fluentd-address=localhost:24220 --log-opt tag="docker.{{.Name}}" python:3 python main.py
> 流畅日志服务器

如果使用fluentd,需要创建一个conf文件。

流利.conf

<source>
  @type forward
  port 24220
</source>

<match docker.**>
  @type stdout
</match>

执行 (shí

docker run -p 24220:24220 -p 24220:24220/udp -v /tmp/fluentd:/fluentd/etc -e FLUENTD_CONF=fluent.conf --name=fluentd --rm fluent/fluentd

执行结果

当执行curl命令时

$ curl http://localhost:8080/
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1>メールアドレスと名前を送信してください</h1>
        <form method="post" enctype="application/x-www-form-urlencoded" action="/text_check">
            <input placeholder="名前" name="username" type="text"/>
            <input placeholder="メール" name="email" type="text"/>
            <input value="送信" type="submit"/>
        </form>
</body>
</html>

流利的出生也是个例子

2019-05-16 01:24:18.000000000 +0000 docker.my-app: {"container_name":"/my-app","source":"stdout","log":"172.17.0.1 - - [16/May/2019 01:24:18] \"GET / HTTP/1.1\" 200 483\r","container_id":"b5d1b68d9515f8b386ef798a97d30a3d8c1d74e04796965c3bbadf3f490d2d23"}

创建并实施实用的运营模型,需要进行验证。

目标

在这个例子中,获取web服务器的日志并进行可视化。
需要创建四个服务器。
1. web服务器(使用Python的bottle实现)
2. 日志聚集服务器(使用fluentd)
3. elasticsearch服务器
4. kibana服务器

请参考以下网络结构图和文件结构来了解具体细节。

文件结构

|-- bottle_app
|      |-- app
|      |    |-- main.py   <- メイン
|      |    |-- views      <- htmlファイル群
|      |
|      |-- Dockerfile
|
|-- fluentd
|      |-- config
|      |    |-- fluent.conf
|      |
|      |-- Dockerfile
|
|-- elasticsearch
|      |-- Dockerfile
|
|-- kibana
|      |-- Dockerfile
|
|-- docker-compose.yml

网络拓扑图

network.jpeg
所有代碼
    docker-compose.yml
version: "3.7"

services:
  bottle_app:
    build: ./bottle_app
    volumes:
      - ./bottle_app/app:/workspace
    ports:
      - "8080:8080"
    logging:
      driver: "fluentd"
      options:
        fluentd-address: "localhost:24220"
        tag: "docker.{{.Name}}"
    depends_on:
      - fluentd

  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/config:/fluentd/etc
    ports:
      - "24220:24220"
      - "24220:24220/udp"
    depends_on:
      - elasticsearch
      - kibana

  elasticsearch:
    build: ./elasticsearch
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1

  kibana:
    build: ./kibana
    ports:
      - "5601:5601"
    • bottle_app/app/main.py

 

    • 1.と同様のプログラム

 

    • bottle_app/Dockerfile

 

    (注意)”-u”オプションを追加すると標準出力がバッファーに溜まることない。
FROM python:3

RUN pip install bottle

WORKDIR /workspace
CMD python -u main.py
    • fluentd/config/fluent.conf

 

    elasticsearchへ出力する必要があるのでのパートを変更。
<source>
  @type forward
  port 24220
</source>

<match docker.**>
  @type elasticsearch
  host elasticsearch
  port 9200
  type_name bottle_app
  logstash_format true
</match>
    • fluentd/Dockerfile

 

    elasticsearchとの接続のためにプラグインをインストールする必要がある。
FROM fluent/fluentd:v1.3.2-1.0

RUN gem install fluent-plugin-elasticsearch
    elasticsearch/Dockerfile
FROM elasticsearch:6.7.1
    kibana/Dockerfile
FROM kibana:6.7.1

执行结果

kibana_pic.png

创建了柱状图,可视化了按时间段划分的访问次数。
另外,由于可以搜索日志,因此日志分析变得更加容易。

关于fluent.conf的配置

    1. 指定输入源所对应的插件。

http: 将Fluentd配置为能够接收作为http端点的请求。

forward: 将Fluentd配置为能够接收作为tcp端点的请求。

    port: 接続するポートを指定
    1. 匹配

@type:通过标签指定事件,并指定输出插件。
可用标准插件:文件(file),转发(forward)

使用外部插件(此次使用elasticsearch)。

    • host: outputする先

 

    • port: 接続するポートを指定

 

    type_name: kibanaで表示するときのログの名前

使用elasticsearch插件时,需要注意以下事项:
– logstash_format: 将其整形为与logstash相符的格式。

参考网站

[1] 一个Docker新手尝试使用fluentd + elasticsearch + kibana来可视化Nginx的日志。
[2] Docker的日志驱动程序:各自的特点和使用场景(json-file,syslog,journald,fluentd)。
[3] 关于Fluentd的安装和配置。
[4] Fluent::Plugin::Elasticsearch。

广告
将在 10 秒后关闭
bannerAds