一、系统的基本架构

  在以前的博客中有介绍过在物理机上搭建ELK日志分析系统,有兴趣的朋友可以看一看-------------->>链接戳我<<。这篇博客将介绍如何使用Docker来更方便快捷的搭建,架构图如下:

  说明:WEB服务器代表收集日志的对象,由Filebeat收集日志后发送给Logstash2,再由Logstash2发送至Redis消息队列,然后由Redis发送至Logstash1,最后由ElasticSearch收集处理并由Kibana进行可视化显示。这里之所以需要两层Logstash是因为WEB服务器可以是任何服务器,可能会出现多个不同日志需要分析。这个架构可以用在较大规模的集群中,在生产中可以将各个功能单点进行扩展,例如将Redis和Logstash集群化。

二、Docker搭建ES集群

  默认系统已安装好docker,创建ES集群docker挂载目录,编辑配置文件:

  1. ~]# mkdir -pv /root/elk/{logs,data,conf}
  1. vim /root/elk/conf/elasticsearch.yml
  2. cluster.name: es5.-cluster #集群识别名,在一个集群中必须同名
  3. node.name: node1 #节点标识
  4. network.host: 192.168.29.115 #节点IP
  5. http.port: 9200 #监听端口
  6. discovery.zen.ping.unicast.hosts: ["192.168.29.115", "192.168.29.116"] #集群节点
  7. http.cors.enabled: true
  8. http.cors.allow-origin: "*"
  1. ~]# docker container run --name es5. \
  2. --network host \
  3. -v /root/elk/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  4. -v /root/elk/data/:/usr/share/elasticsearch/data/ \
  5. -v /root/elk/logs/:/usr/share/elasticsearch/logs/ \
  6. -p : \
  7. -p : \
  8. -d --rm docker.io/elasticsearch:5.6

  安装ElasticSearch-head,查看ES集群是否安装成功:

  1. ~]# docker container run --name es-head -p : -d --rm mobz/elasticsearchhead:

三、Docker安装Filebeat

  编辑Filebeat配置文件,把配置文件、log挂载至docker卷,,定义要送至Logstash的log文件与输出目标:

  1. vim /root/filebeat/conf/filebeat.yml
  2. filebeat.prospectors:
  3. - input_type: log
  4. paths:
  5. - /var/log/messages
  6. exclude_lines: ["^DBG"]
  7. document_type: system-log-
  8. - input_type: log
  9. paths:
  10. - /var/log/nginx/access.log
  11. document_type: nginx-log-0019 #相对的是logstash中的type,可以在Logstash中做if判断
  12. output.logstash:
  13. hosts: ["192.168.29.119:5044","192.168.29.119:5045"]
  14. enabled: true
  15. worker:
  16. compression_level:
  17. loadbalance: true
  1. ~]# docker container run --name filebeat --network host \
  2. -v /root/filebeat/conf/filebeat.yml:/usr/share/filebeat/filebeat.yml \
  3. -v /var/log/messages:/var/log/messages \
  4. -v /var/log/nginx/access.log:/var/log/nginx/access.log \
  5. --rm -d docker.elastic.co/beats/filebeat:5.6.15 \
  6. filebeat -c /usr/share/filebeat/filebeat.yml

四、Docker安装Logstash

  1. docker container run --name logstash \
  2. -p : \
  3. -v /var/log/nginx/access.log:/var/log/nginx/access.log \
  4. -v /var/log/messages:/var/log/messages \
  5. -v /root/logstash/pipeline/stdout.conf:/etc/logstash/conf.d/stdout.conf \
  6. -d --network host -it --rm docker.io/logstash:5.6 \
  7. -f /etc/logstash/conf.d/stdout.conf

  Logstash收集多个日志并输出示例(与此架构无关,只是示范示例):

  1. vim /root/logstash/pipeline/stdout.conf
  2. input {
  3. file {
  4. type => "nginxaccesslog"
  5. path => "/var/log/nginx/access.log"
  6. start_position => "beginning"
  7. }
  8. file {
  9. type => "syslog"
  10. path => "/var/log/messages"
  11. start_position => "beginning"
  12. }
  13. }
  14. output {
  15. if [type] == "nginxaccesslog" {
  16. elasticsearch {
  17. hosts => ["192.168.29.115:9200"]
  18. index => "nginx-log-0018-%{+YYYY.MM.dd}"
  19. }
  20. }
  21. if [type] == "syslog" {
  22. elasticsearch {
  23. hosts => ["192.168.29.115:9200"]
  24. index => "syslog-0018-%{+YYYY.MM.dd}"
  25. }
  26. }
  27. }

  配置Logstash2上的输入输出配置:

  这里先进行测试,用Filebeat收集WEB服务器上的 /var/log/messages 与 /var/log/nginx/access.log 日志并进行标准输出,配置如下:

  1. vim /root/logstash/conf/stdout.conf
  2. input {
  3. beats {
  4. port =>
  5. codec => "json"
  6. }
  7. beats {
  8. port =>
  9. codec => "json"
  10. }
  11. }
  12. output {
  13. stdout {
  14. codec => "rubydebug"
  15. }
  16. }

  启动Logstash2并查看是否可读取日志并输出:

  1. docker container run --name logstash \
  2. -p : \
  3. -v /root/logstash/conf/stdout.conf:/etc/logstash/conf.d/stdout.conf -it \
    --network host \
  4. --rm docker.io/logstash:5.6 \
  5. -f /etc/logstash/conf.d/stdout.conf

  如截图所示便是正常:

  可以看到/var/log/messages与/var/log/nginx/access.log都能正常收集并输出。

五、Docker安装Redis

  修改配置:

  1. vim /root/redis/conf/redis.conf
  2. bind 0.0.0.0
  3. port
  4. requirepass 123456 #配置密码
  5. save ""
  6. pidfile /var/run/redis/redis.pid
  7. logfile /var/log/redis/redis.log #注意权限

  运行:

  1. ~]# docker container run --name redis \
  2. -v /root/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  3. -v /root/redis/log/redis.log:/var/log/redis/redis.log \
  4. -v /root/redis/run/redis.pid:/var/run/redis/redis.pid \
  5. -v /root/redis/data/:/data/ \
  6. -p : --network host -d \
  7. docker.io/redis: redis-server /usr/local/etc/redis/redis.conf

六、Docker启动并配置Logstash2收集多日志并送至Redis

  1. vim /root/logstash/conf/stdout.conf
  2. input {
  3. beats {
  4. port =>
  5. codec => "json"
  6. }
  7. beats {
  8. port =>
  9. codec => "json"
  10. }
  11. }
  12. output {
  13. if [type] == "system-log-0019" {
  14. redis {
  15. data_type => "list"
  16. host => "192.168.29.117"
  17. port => ""
  18. key => "system-log-0019"
  19. db => ""
  20. password => ""
  21. }
  22. }
  23. if [type] == "nginx-log-0019" {
  24. redis {
  25. data_type => "list"
  26. host => "192.168.29.117"
  27. port => ""
  28. key => "nginx-log-0019"
  29. db => ""
  30. password => ""
  31. }
  32. }
  33. }

  再次启动Logstash2:

  1. ~]# docker container run --name logstash \
  2. -p : \
  3. -v /root/logstash/conf/stdout.conf:/etc/logstash/conf.d/stdout.conf -it \
  4. --network host \
  5. --rm docker.io/logstash:5.6 \
  6. -f /etc/logstash/conf.d/stdout.conf

  链接Redis查看日志是否已被收集

  1. ~]# redis-cli -h 192.168.29.117
  1. 192.168.29.117:> AUTH
  2. OK
  3. 192.168.29.117:> SELECT #选择数据库号
  4. OK
  5. 192.168.29.117:[]> KEYS *
  6. ) "nginx-log-0019" #可以看到日志已写入成功,这里是前面在Logstash中定义的key
  7. ) "system-log-0019"
  8. 192.168.29.117:[]> LLEN system-log-
  9. (integer)
  10. 192.168.29.117:[]> LLEN nginx-log-
  11. (integer)

  也可以在Redis上查看是否连接:

  1. ~]# lsof -n -i:
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. redis-ser polkitd 6u IPv4 0t0 TCP *: (LISTEN)
  4. redis-ser polkitd 7u IPv4 0t0 TCP 192.168.29.117:->192.168.29.104: (ESTABLISHED)
  5. redis-ser polkitd 10u IPv4 0t0 TCP 127.0.0.1:->127.0.0.1: (ESTABLISHED)
  6. redis-cli root 3u IPv4 0t0 TCP 127.0.0.1:->127.0.0.1: (ESTABLISHED)

  以上步骤log文件走向:WEB→Filebeat→Logstash2→Redis。下面再来配置Redis→Logstash1→ES→Kibana。

七、docker配置Logstash1

  1. vim /root/logstash/conf/stdout.conf
  2. input {
  3. redis {
  4. data_type => "list"
  5. host => "192.168.29.117"
  6. port => ""
  7. key => "system-log-0019"
  8. db => ""
  9. password => ""
  10. }
  11. redis {
  12. data_type => "list"
  13. host => "192.168.29.117"
  14. port => ""
  15. key => "nginx-log-0019"
  16. db => ""
  17. password => ""
  18. codec => "json"
  19. }
  20. }
  21. output {
  22. if [type] == "system-log-0019" { #用if判断来选择ES节点
  23. elasticsearch {
  24. hosts => ["192.168.29.115:9200"] #节点可以自定义
  25. index => "system-log-0019-%{+YYYY.MM.dd}"
  26. }
  27. }
  28. if [type] == "nginx-log-0019" {
  29. elasticsearch {
  30. hosts => ["192.168.29.115:9200"]
  31. index => "nginx-log-0019-%{+YYYY.MM.dd}"
  32. }
  33. }
  34. }

  启动Logstash1并挂载配置:

  1. ~]# docker container run --name logstash \
  2. -p : \
  3. -v /root/logstash/conf/stdout.conf:/etc/logstash/conf.d/stdout.conf -it \
  4. --network host \
  5. --rm docker.io/logstash:5.6 \
  6. -f /etc/logstash/conf.d/stdout.conf

  查看Redis中的数据是否已被ES取走:

  1. 192.168.29.117:[]> LLEN nginx-log-
  2. (integer)
  3. 192.168.29.117:[]> LLEN system-log-
  4. (integer)

  以上Redis显示说明数据已被ES取走。

八、docker启动并配置Kibana

  配置Kibana:

  1. vim /etc/kibana/kibana.yml
  2. server.host: "127.0.0.1"
  3. elasticsearch.url: "http://192.168.29.115:9200"

  启动Kibana:

  1. ~]# docker container run --name kibana \
    -v /etc/kibana/kibana.yml:/etc/kibana/kibana.yml \
    --network host \
    -p : \
    -d --rm kibana:5.6

  为安全起见,这里建议用Nginx加密返代Kibana进行访问。

  最后在Kibana中添加index就能访问并搜索采集的日志了:

Docker搭建ElasticSearch+Redis+Logstash+Filebeat日志分析系统的更多相关文章

  1. 快速搭建ELK7.5版本的日志分析系统--搭建篇

    title: 快速搭建ELK7.5版本的日志分析系统--搭建篇 一.ELK安装部署 官网地址:https://www.elastic.co/cn/ 官网权威指南:https://www.elastic ...

  2. ELK + Filebeat 日志分析系统

    ELK + Filebeat 日志分析系统 架构图 环境 OS:CentOS 7.4 Filebeat: 6.3.2 Logstash: 6.3.2 Elasticsearch 6.3.2 Kiban ...

  3. filebeat+redis+logstash+elasticsearch+kibana搭建日志分析系统

    filebeat+redis+elk搭建日志分析系统 官网下载地址:https://www.elastic.co/downloads 1.下载安装filebeat wget https://artif ...

  4. Docker笔记(十):使用Docker来搭建一套ELK日志分析系统

    一段时间没关注ELK(elasticsearch —— 搜索引擎,可用于存储.索引日志, logstash —— 可用于日志传输.转换,kibana —— WebUI,将日志可视化),发现最新版已到7 ...

  5. centos7搭建ELK Cluster集群日志分析平台(二):Logstash

    续  centos7搭建ELK Cluster集群日志分析平台(一) 已经安装完Elasticsearch 5.4 集群. 安装Logstash步骤 . 安装Java 8 官方说明:需要安装Java ...

  6. centos7搭建ELK Cluster集群日志分析平台(一):Elasticsearch

    应用场景: ELK实际上是三个工具的集合,ElasticSearch + Logstash + Kibana,这三个工具组合形成了一套实用.易用的监控架构, 很多公司利用它来搭建可视化的海量日志分析平 ...

  7. ELK_日志分析系统Logstash+ElasticSearch+Kibana4

    elk 日志分析系统 Logstash+ElasticSearch+Kibana4 logstash 管理日志和事件的工具 ElasticSearch 搜索 Kibana4 功能强大的数据显示客户端 ...

  8. elk 日志分析系统Logstash+ElasticSearch+Kibana4

    elk 日志分析系统 Logstash+ElasticSearch+Kibana4 logstash 管理日志和事件的工具 ElasticSearch 搜索 Kibana4 功能强大的数据显示clie ...

  9. docker:搭建ELK 开源日志分析系统

    ELK 是由三部分组成的一套日志分析系统, Elasticsearch: 基于json分析搜索引擎,Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片 ...

随机推荐

  1. 匿名函数 javascript

    匿名函数: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  2. 关于XML

    一.XML定义 XML(eXtensible Markup Language)即可扩展标记语言,它与HTML一样,都是处于SGML,标准通用语言.Xml是Internet环境中跨平台的,依赖于内容的技 ...

  3. 弄懂CNN,然后提升准确率4.21-4.27

    英语: 1.每天背单词,75起步.(这周没怎么背,考虑调整了) 2.并背王江涛图画作文一:传统文化(这周没背,但肯定要做) 学校: 0.吴恩达ML 1.毕设一:可视化,肺癌基因突变,深度学习(那么作图 ...

  4. APP研发录笔记

    一.消灭全局变量 在内存不足时,系统会回收一部分闲置的资源,由于App被切换到后台,所以之前存放的全局变量很容易被回收,这时再切换到前台继续使用,会报空指针崩溃.想彻底解决这个问题,就要使用序列化. ...

  5. [译]async/await中阻塞死锁

    这篇博文主要是讲解在async/await中使用阻塞式代码导致死锁的问题,以及如何避免出现这种死锁.内容主要是从作者Stephen Cleary的两篇博文中翻译过来. 原文1:Don'tBlock o ...

  6. 微信小程序写tab切换

    微信小程序之tab切换效果,如图: 最近在学习微信小程序并把之前的公司app搬到小程序上,挑一些实现效果记录一下(主要是官方文档里没说的,毕竟官方文档只是介绍功能) .wxml代码: <view ...

  7. 快速理解Token,Cookie,Session

    在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie ...

  8. Android单元测试之四:仪器化测试

    Android单元测试之四:仪器化测试 仪器化测试 在某些情况下,虽然可以通过模拟的手段来隔离 Android 依赖,但代价很大,这种情况下可以考虑仪器化的单元测试,有助于减少编写和维护模拟代码所需的 ...

  9. #Java学习之路——基础阶段(第三篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  10. [Swift]LeetCode298. 二叉树最长连续序列 $ Binary Tree Longest Consecutive Sequence

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...