上一节写了最简单架构的搭建和日志采集:传送门

主要有这几种架构方式

1. Elasticsearch + Logstash + Kibana

每台机器(客户端)上部署Logstash,logstash收集了数据直接往es里面写,es分析日志,kibana查询es的数据做展示。

这是一种最简单的架构。这种架构虽然是官网介绍里的方式,但是往往在生产中很少使用。因为这样要在每台机器上都部署logstash,资源消耗比较大。

2. Elasticsearch + Logstash + filebeat + Kibana

每台机器(客户端)上部署filebeat收集数据,filebeat往1台logstash里面写,logstash往es里面写,es分析日志,kibana查询es的数据做展示。

与上一种架构相比,这种架构增加了一个filebeat模块。filebeat是一个轻量的日志收集代理,优势是消耗非常少的资源(较logstash), 所以生产中,往往会采取这种架构方式,但是这种架构有一个缺点,当logstash出现故障, 会造成日志的丢失。

3.  Elasticsearch + Logstash + filebeat + kafka(也可以是其他中间件,比如RabbitMQ) + Kibana

每台机器(客户端)上部署filebeat收集数据,filebeat往消息中间件集群写,1台logstash消费消息中间件集群然后往es里面写,es分析日志,kibana查询es的数据做展示。

这种架构是上面那个架构的完善版,通过增加中间件,来避免数据的丢失。当Logstash出现故障,日志还是存在中间件中,当Logstash再次启动,则会读取中间件中积压的日志。
 本节还是基于上一节的简单架构增加 filebeat和kafka组件完善

1. 下载镜像

# zookeeper镜像
docker pull wurstmeister/zookeeper
# kafka镜像
docker pull wurstmeister/kafka

2. 启动ZK

docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper

3. 启动kafka

docker run -d --name kafka \
--env KAFKA_ADVERTISED_HOST_NAME=localhost \
--env KAFKA_ZOOKEEPER_CONNECT=10.33.2.23:2181 \
--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.33.2.23:9092 \
--env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
--env KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" \
--net=host wurstmeister/kafka

10.33.2.23 是服务器ip

4. 验证kafka是否生效

进入kafka容器

docker exec -it kafka /bin/bash

cd /opt/kafka_2.12-2.2.0/bin/

新建一个test主题,并以生产者身份进行消息生产

./kafka-topics.sh --create --zookeeper 10.30.2.222:2181 --replication-factor 1 --partitions 1 --topic test
./kafka-console-producer.sh --broker-list 10.30.2.222:9092 --topic test
>hello # 发送一条消息并回车
>world

打开一个新的ssh连接,同样进入kafka容器,模拟消费者接收消息

docker exec -it kafka /bin/bash

cd /opt/kafka_2.12-2.2.0/bin/
# 以消费者身份接收消息
./kafka-console-consumer.sh --bootstrap-server 10.30.2.222:9092 --topic test --from-beginning
hello # 成功接收到消息
world

5. 安装Filebeat

docker pull elastic/filebeat:6.4.1     #拉取镜像

启动filebeat

docker run -d --name=filebeat elastic/filebeat:6.4.1

拷贝文件赋予权限,/home/images/elk_single/filebeat/为自己新建的文件夹,自行修改

docker cp filebeat:/usr/share/filebeat /home/images/elk_single/filebeat/

chmod 777 -R  /home/images/elk_single/filebeat

chmod go-w /home/images/elk_single/filebeat/filebeat/filebeat.yml

修改配置文件filebeat.yml ,/home/application/logs/springboot.log为宿主机日志路径,

topic: 'elk-%{[fields][log_topics]}' , 则是输出的topic的名称 例如对于第一个则topic的名称为

elk-springboot-test-application

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /home/application/logs/springboot.log
  fields:
    log_topics: springboot-test-application
- type: log
  enabled: true
  paths:
    - /home/image/nginx/access.log
  fields:
    log_topics: nginx  

output.kafka:
  hosts: ["10.1.2.3:9200"]
  topic: 'elk-%{[fields][log_topics]}'

启动filebeat,将要收集的日志目录从外面挂进来

docker run -d --name=filebeat -v /home/images/elk_single/filebeat/filebeat:/usr/share/filebeat -v /home/application/logs/:/home/application/logs elastic/filebeat:6.4.1

修改logstash配置文件,input设置为kafka输入

input {
  kafka{
    bootstrap_servers => "10.1.2.3:9092"
    topics_pattern  => "elk-.*"
    consumer_threads => 5
    decorate_events => true
    codec => "json"
    auto_offset_reset => "latest"
  }
}
output {
  elasticsearch {
    hosts => "es:9200"
    index => "logstash-%{+YYYY.MM.dd}"
  }
}

然后向日志文件里加东西试试,启动一个kafka的消费者消费到就成功了

echo "我是日志" >> /home/application/logs/springboot.log