环境说明:
主机名 | 操作系统版本 | 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日志处理流程
二、Fluentd
1. Fluentd简介
Fluentd是一个免费和开源的日志收集器,目前支持超过600种输入源,可以连接各种数据源和数据输出组件。fluentd基于CRuby实现,并对性能表现关键的一些组件用C语言重新实现,整体性能不错。Fluentd有很强的的扩展性,最大支持超过500000台服务器。
本文使用Fluentd替换Logstash搭建EFK日志管理系统。
- 安装方便
- 占用空间小
- 半结构化数据日志记录
- 灵活的插件机制
- 可靠的缓冲
- 日志转发
2. Fluentd日志处理流程
三、日志管理系统搭建
本文采用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 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
6. 查看容器
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
8.2 查看日志索引
http://172.27.9.71:9200/_search?pretty
8.3 配置index pattern
指定index pattern为fluentd-*,这与Elasticsearch中的index一致,Time-field name选择 @timestamp,点击Create创建index pattern。