开始使用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
网络拓扑图
所有代碼
- 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
执行结果
创建了柱状图,可视化了按时间段划分的访问次数。
另外,由于可以搜索日志,因此日志分析变得更加容易。
关于fluent.conf的配置
-
- 指定输入源所对应的插件。
http: 将Fluentd配置为能够接收作为http端点的请求。
forward: 将Fluentd配置为能够接收作为tcp端点的请求。
- port: 接続するポートを指定
-
- 匹配
@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。