Docker搭建ELKF日志分析体系

打印 上一主题 下一主题

主题 676|帖子 676|积分 2028

Docker搭建ELKF日志分析体系


  
资源列表

操纵体系配置主机名IP所需软件CentOS 7.94C8Gdocker192.168.93.165Docker-ce 26.1.2 底子环境



  • 关闭防火墙
  1. systemctl stop firewalld
  2. systemctl disable firewalld
复制代码


  • 关闭内核安全机制
  1. setenforce 0
  2. sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
复制代码


  • 修改主机名
  1. hostnamectl set-hostname docker
复制代码
一、体系环境准备



  • 基于Docker环境摆设ELKF日志分析体系,实现日志分析功能
1.1、创建所需的映射目录

  1. # 根据实际情况做修改
  2. [root@docker ~]# mkdir -p /var/log/elasticsearch
  3. [root@docker ~]# chmod -R 777 /var/log/elasticsearch/
复制代码
1.2、修改体系参数

  1. # 定义了一个进程可以拥有的最大内存映射区域数
  2. [root@docker ~]# echo "vm.max_map_count=655360" >> /etc/sysctl.conf
  3. [root@docker ~]# sysctl -p
  4. vm.max_map_count = 655360
  5. # 配置用户和系统级的资源限制。修改的内容立即生效(严谨)
  6. [root@docker ~]# cat >> /etc/security/limits.conf << EOF
  7. * soft nofile 65535
  8. * hard nofile 65535
  9. * soft nproc 65535
  10. * hard nproc 63335
  11. * soft memlock unlimited
  12. * hard memlock unlimited
  13. EOF
复制代码
1.3、单击创建elk-kgc网络桥接

  1. [root@docker ~]# docker network create elk-kgc
  2. b8b1b7e36412169d689c39b39b5624c79f8fe0698a3c7b95dc1c78852285644e
  3. [root@docker ~]# docker network ls
  4. NETWORK ID     NAME      DRIVER    SCOPE
  5. e8a2cadd9616   bridge    bridge    local
  6. b8b1b7e36412   elk-kgc   bridge    local
  7. 3566b89c775b   host      host      local
  8. a5914394299b   none      null      local
复制代码
二、基于Dockerfile构建Elasticsearch镜像



  • 执行步调如下:
2.1、创建Elasticsearch工作目录

  1. [root@docker ~]# mkdir -p /root/elk/elasticsearch
  2. [root@docker ~]# cd /root/elk/elasticsearch/
复制代码
2.2、上传资源到指定工作路径



  • 上传Elasticsearch的源码包和Elasticsearch配置文件到/root/elk/elasticsearch目录下,所需文件如下
  1. [root@docker elasticsearch]# ll
  2. total 27872
  3. -rw-r--r-- 1 root root 28535876 Jun  6 22:45 elasticsearch-6.1.0.tar.gz
  4. -rw-r--r-- 1 root root     3017 Jun  6 22:44 elasticsearch.yml
  5. # 配置文件内容yml如下
  6. [root@docker elasticsearch]# cat elasticsearch.yml | grep -v "#"
  7. cluster.name: kgc-elk
  8. node.name: node-1
  9. path.logs: /var/log/elasticsearch
  10. bootstrap.memory_lock: false
  11. network.host: 0.0.0.0
  12. http.port: 9200
复制代码
2.3、编写Dockerfile文件

  1. [root@docker elasticsearch]# cat Dockerfile
  2. FROM centos:7
  3. MAINTAINER wzh@kgc.com
  4. RUN yum -y install java-1.8.0-openjdk vim telnet lsof
  5. ADD elasticsearch-6.1.0.tar.gz /usr/local/
  6. RUN cd /usr/local/elasticsearch-6.1.0/config
  7. RUN mkdir -p /data/behavior/log-node1
  8. RUN mkdir /var/log/elasticsearch
  9. COPY elasticsearch.yml /usr/local/elasticsearch-6.1.0/config/
  10. RUN useradd es && chown -R es:es /usr/local/elasticsearch-6.1.0/
  11. RUN chmod +x /usr/local/elasticsearch-6.1.0/bin/*
  12. RUN chown -R es:es /var/log/elasticsearch/
  13. RUN chown -R es:es /data/behavior/log-node1/
  14. RUN sed -i "s/-Xms1g/-Xms2g/g" /usr/local/elasticsearch-6.1.0/config/jvm.options
  15. RUN sed -i "s/-Xmx1g/-Xmx2g/g" /usr/local/elasticsearch-6.1.0/config/jvm.options
  16. EXPOSE 9200
  17. EXPOSE 9300
  18. CMD su es /usr/local/elasticsearch-6.1.0/bin/elasticsearch
复制代码
2.4、构建Elasticsearch镜像

  1. [root@docker elasticsearch]# docker build -t elasticsearch .
复制代码
三、基于Dockerfile构建Kibana镜像



  • 执行步调如下:
3.1、创建Kibana工作目录

  1. [root@docker ~]# mkdir -p /root/elk/kibana
复制代码
3.2、上传资源到指定工作目录



  • 上传kibana的源码包到/root/elk/kibana目录下
  1. [root@docker ~]# ll /root/elk/kibana/
  2. total 64404
  3. -rw-r--r-- 1 root root 65947685 Jun  6 23:09 kibana-6.1.0-linux-x86_64.tar.gz
复制代码
3.3、编写Dockerfile文件

  1. [root@docker ~]# cd /root/elk/kibana/
  2. [root@docker kibana]# cat Dockerfile
  3. FROM centos:7
  4. MAINTAINER wzh@kgc.com
  5. RUN yum -y install java-1.8.0-openjdk vim telnet lsof
  6. ADD kibana-6.1.0-linux-x86_64.tar.gz /usr/local/
  7. RUN cd /usr/local/kibana-6.1.0-linux-x86_64
  8. RUN sed -i "s/#server.name: "your-hostname"/server.name: "kibana-hostname"/g" /usr/local/kibana-6.1.0-linux-x86_64/config/kibana.yml
  9. RUN sed -i "s/#server.port: 5601/server.port: "5601"/g" /usr/local/kibana-6.1.0-linux-x86_64/config/kibana.yml
  10. RUN sed -i "s/#server.host: "localhost"/server.host: "0.0.0.0"/g" /usr/local/kibana-6.1.0-linux-x86_64/config/kibana.yml
  11. RUN sed -ri '/elasticsearch.url/ s/^#|"//g' /usr/local/kibana-6.1.0-linux-x86_64/config/kibana.yml
  12. RUN sed -i "s/localhost:9200/elasticsearch:9200/g" /usr/local/kibana-6.1.0-linux-x86_64/config/kibana.yml
  13. EXPOSE 5601
  14. CMD ["/usr/local/kibana-6.1.0-linux-x86_64/bin/kibana"]
复制代码
3.4、构建Kibana镜像

  1. [root@docker kibana]# docker build -t kibana .
复制代码
四、基于Dockerfile构建Logstash镜像



  • 执行步调如下
4.1、创建Logstash工作目录

  1. [root@docker ~]# mkdir -p /root/elk/logstash
复制代码
4.2、编写Dockerfile文件

  1. [root@docker ~]# cd /root/elk/logstash/
  2. [root@docker logstash]# cat Dockerfile
  3. FROM centos:7
  4. MAINTAINER wzh@kgc.com
  5. RUN yum -y install java-1.8.0-openjdk vim telnet lsof
  6. ADD logstash-6.1.0.tar.gz /usr/local/
  7. RUN cd /usr/local/logstash-6.1.0/
  8. ADD run.sh /run.sh
  9. RUN chmod 755 /*.sh
  10. EXPOSE 5044
  11. CMD ["/run.sh"]
复制代码
4.3、创建CMD运行的脚本文件

  1. [root@docker logstash]# cat run.sh
  2. #!/bin/bash
  3. /usr/local/logstash-6.1.0/bin/logstash -f /opt/logstash/conf/nginx-log.conf
复制代码
4.4、上传资源到指定工作目录



  • 上传logstash的源码包到/root/elk/logstash目录下,所需文件如下
  1. [root@docker logstash]# ll
  2. total 107152
  3. -rw-r--r-- 1 root root       230 Jun  7 00:41 Dockerfile
  4. -rw-r--r-- 1 root root 109714065 Jun  7 00:40 logstash-6.1.0.tar.gz
  5. -rw-r--r-- 1 root root        88 Jun  7 00:42 run.sh
复制代码
4.5、构建Logstash镜像

  1. [root@docker logstash]# docker build -t logstash .
复制代码
4.6、logstash配置文件详解



  • logstash功能非常强大,不仅仅是分析传入的文本,还可以作监控与告警之用。现在介绍logstash的配置文件其使用履历
  • logstash默认的配置文件不必要修改,只必要启动的时间指定一个配置文件即可!好比run.sh脚本中指定/opt/logstash/conf/nginx-log.conf。留意:文件包含了input、filter、output三部分,其中filter不是必须的
  1. [root@docker ~]# mkdir -p /opt/logstash/conf
  2. [root@docker ~]# vim /opt/logstash/conf/nginx-log.conf
  3. input {
  4.   beats {
  5.     port => 5044
  6.   }
  7. }
  8. filter {
  9.     if "www-bdqn-cn-pro-access" in [tags] {
  10.         grok {
  11.                 match => {"message" => '%{QS:agent} "%{IPORHOST:http_x_forwarded_for}" - \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version})?|-)" %{NUMBER:response} %{NUMBER:bytes} %{QS:referrer} %{IPORHOST:remote_addr}:%{POSINT:port} %{NUMBER:remote_addr_response} %{BASE16FLOAT:request_time}'}
  12.         }
  13.     }
  14.     urldecode {all_fields => true}
  15.     date {
  16.       match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
  17.     }
  18.     useragent {
  19.       source => "agent"
  20.       target => "ua"
  21.     }
  22. }
  23. output {
  24.   if "www-bdqn-cn-pro-access" in [tags] {
  25.     elasticsearch {
  26.       hosts => ["elasticsearch:9200"]
  27.       manage_template => false
  28.       index => "www-bdqn-cn-pro-access-%{+YYYY.MM.dd}"
  29.     }
  30.   }
  31. }
  32. # 注意:使用nginx-log.conf文件拷贝时,match最长的一行自动换行问题
复制代码
4.6.1、关于filter部分



  • 输入和输出在logstash配置中是很简朴的一步,而对数据进行匹配过滤处置惩罚显得复杂。匹配当行日志是入门水平必要掌握的,而多行甚至不规则的日志则必要ruby的协助。本例主要展示grok插件
  • 以下是某生产环境nginx的access日志格式
  1. log_format main '"$http_user_agent""$http_x_forwarded_for" '
  2.                 '$remote_user [$time_local] "$request" '
  3.                 '$status $body_bytes_sent "$http_referer" '
  4.                 '$upstream_addr $upstream_status $upstream_response_time';
复制代码


  • 下面是对应上述nginx日志格式的grok捕捉语法
  1. '%{QS:agent} "%{IPORHOST:http_x_forwarded_for}" - \[%{HTTPDATE:timestamp}\]
  2. "(?:%{WORD:verb} %{NOTSPACE:request}(?:
  3. HTTP/%{NUMBER:http_version})?|-
  4. )"%{NUMBER:response}%{NUMBER:bytes}%{QS:referrer}%{IP
  5. ORHOST:remote_addr}:%{POSINT:port}
  6. %{NUMBER:remote_addr_response}%{BASE16FLOAT:request_ time}'
复制代码
在filter段内的第一行是判断语句,如果www-bdqn-cn-pro-access自界说字符在tags内,则使用grok段内的语句对日志进行处置惩罚


  • geopi:使用GeoIP数据库对client_ip字段的IP地点进行解析,可得出该IP的经纬度、国家与都会等信息,但准确度不高,这主要依赖于GeoIP数据库
  • date:默认环境下,Elasticsearch内记载的date字段是Elasticsearch接收到该日志的时间,但在实际应用中必要修改为日志中所记载的时间。这时,必要指定记载时间的字段并指定时间格式。如果匹配成功,则会将日志的时间替换至date字段中
  • useragent:主要为webapp提供的解析,可以解析现在常见的一些useragent
4.6.2、关于output部分



  • logstash可以在上层配置一个负载调度器实现聚集。在实际应用中,logstash服务必要处置惩罚多种不同类型的日志或数据。处置惩罚后的日志或数据必要存放在不同的Elasticsearch聚集或索引中,必要对日志进行分类
  1. output {
  2.   if "www-bdqn-cn-pro-access" in [tags] {
  3.     elasticsearch {
  4.       hosts => ["elasticsearch:9200"]
  5.       manage_template => false
  6.       index => "www-bdqn-cn-pro-access-%{+YYYY.MM.dd}"
  7.     }
  8.   }
  9. }
复制代码
通过在output配置中设定判断语句,将处置惩罚后的数据存放到不同的索引中。而这个tags的添加有以下三种途径:


  • 在Filebeat读取数据后,向logstash发送前添加到数据中
  • logstash处置惩罚日志的时间,向tags标签添加自界说内容
  • 在logstash接收传入数据时,向tags标签添加自界说内容
从上面的输入配置文件中可以看出,这里来采用的第一种图形,在Filebeat读取数据后,向logstash发送数据前添加www-bdqn-cn-pro-access的tag
这个操纵除非在后续处置惩罚数据的时间手动将其删除,否则将永久存在该数据中
Elasticsearch字段的各参数意义如下:


  • hosts:指定Elasticsearch地点,如有多个节点可用,可以设置为array模式,可实现负载平衡
  • manage_template:如果该索引没有合适的模板可用,默认环境下将由默认的模板进行管理
  • index:只当存储数据的索引
五、基于Dockerfile构建Filebeat镜像



  • 执行步调如下:
5.1、创建Filebeat工作目录

  1. [root@docker ~]# mkdir -p /root/elk/Filebeat
复制代码
5.2、编写Dockerfile文件

  1. [root@docker ~]# cd /root/elk/Filebeat/
  2. [root@docker Filebeat]# cat Dockerfile
  3. FROM centos:7
  4. MAINTAINER wzh@kgc.com
  5. ADD filebeat-6.1.0-linux-x86_64.tar.gz /usr/local/
  6. RUN cd /usr/local/filebeat-6.1.0-linux-x86_64
  7. RUN mv /usr/local/filebeat-6.1.0-linux-x86_64/filebeat.yml /root
  8. COPY filebeat.yml /usr/local/filebeat-6.1.0-linux-x86_64/
  9. ADD run.sh /run.sh
  10. RUN chmod 755 /*.sh
  11. CMD ["/run.sh"]
复制代码
5.3、创建CMD运行的脚本文件

  1. [root@docker Filebeat]# cat run.sh
  2. #!/bin/bash
  3. /usr/local/filebeat-6.1.0-linux-x86_64/filebeat -e -c /usr/local/filebeat-6.1.0-linux-x86_64/filebeat.yml
复制代码
5.4、上传资源到指定工作目录



  • 上传Filebeat的源码包和Filebeat配置文件到/root/elk/filebeat目录下,所需文件如下
  1. [root@docker Filebeat]# ll
  2. total 11660
  3. -rw-r--r-- 1 root root      312 Jun  7 01:11 Dockerfile
  4. -rw-r--r-- 1 root root 11926942 Jun  7 01:09 filebeat-6.1.0-linux-x86_64.tar.gz
  5. -rw-r--r-- 1 root root      186 Jun  7 01:14 filebeat.yml
  6. -rw-r--r-- 1 root root      118 Jun  7 01:12 run.sh
复制代码
5.5、构建Filebeat镜像

  1. [root@docker Filebeat]# docker build -t filebeat .
复制代码
5.6、Filebeat.yml文件详解



  • Filebeat配置我呢见详解查看Filebeat的配置文件
  1. [root@docker Filebeat]# cat filebeat.yml
  2. filebeat.prospectors:
  3. - input_type: log
  4.   paths:
  5.     - /var/log/nginx/www.bdqn.cn-access.log
  6.   tags: www-bdqn-cn-pro-access
  7.   clean_*: true
  8. output.logstash:
  9.   hosts: ["logstash:5044"]
  10. # 每个Filebeat可以根据需求的不同拥有一个或多个prospectors。其他配置信息含义如下:
  11. 1、input_type:输入的内容,主要为逐行读取的log格式与标准输入stdin
  12. 2、paths:指定需要读取的日志的路径,如果路径拥有相同的结构,则可以使用通配符
  13. 3、tags:为该路径的日志添加自定义tags
  14. 4、clean_:Filebeat在/var/lib/filebeat/registry下有个注册表文件,它记录着Filebeat读取过的文件,还有已经读取的行数等信息。如果日志文件是定时分割,而且数量会随之增加,那么该注册表文件也会慢慢增大。随着注册表的增大,会导致Filebeat检索的性能下降
  15. 5、output.logstash:定义内容输出的路径,这里主要输出到Elasticsearch
  16. 6、hosts:只当服务地址
复制代码
六、启动Nginx容器作为日志输入源



  • 使用docker run下令启动一个nginx容器
  1. [root@docker ~]# docker run -itd -p 80:80 --network elk-kgc -v /var/log/nginx:/var/log/nginx --name nginx-elk nginx:latest
复制代码


  • 本地目录/var/log/nginx必须挂载到Filebeat容器中,让Filebeat可以采集到日目录
  • 手动模仿生产环境几条日志文件作为nignx容器所产生的站点日志,同样留意拷贝的时间换行问题
  1. [root@docker nginx]# cat www.bdqn.cn-access.log
  2. "YisouSpider" "106.11.155.156" - [18/Jul/2020:00:00:13 +0800] "GET /applier/position?gwid=17728&qyid=122257 HTTP/1.0" 200 9197 "-" 192.168.10.131:80 2000.032
  3. "-""162.209.213.146" - [18/Jul/2020:00:02:11 +0800] "GET //tag/7764.shtml HTTP/1.0" 200 24922 "-" 192.168.10.131:80 200 0.074
  4. "YisouSpider" "106.11.152.248" - [18/Jul/2020:00:07:44+0800] "GET /news/201712/21424.shtml HTTP/1.0" 200 8821 "-" 192.168.10.131:80 2000.097
  5. "YisouSpider" "106.11.158.233" - [18/Jul/2020:00:07:44+0800] "GET /news/201301/7672.shtml HTTP/1.0" 200 8666 "-" 192.168.10.131:80 2000.111
  6. "YisouSpider" "106.11.159.250" - [18/Jul/2020:00:07:44+0800] "GET /news/info/id/7312.html HTTP/1.0" 200 6617 "-" 192.168.10.131:80 2000.339
  7. "Mozilla/5.0 (compatible;SemrushBot/2~bl;+http://www.semrush.com/bot.html)" "46.229.168.83" - [18/Jul/2020:00:08:57+0800] "GET /tag/1134.shtml HTTP/1.0"2006030"-"192.168.10.131:80 200 0.079
复制代码
七、启动Filebeat+ELK日志收集环境



  • 留意启动顺序和查看启动日志
7.1、启动Elasticsearch

  1. [root@docker ~]# docker run -itd -p 9200:9200 -p 9300:9300 --network elk-kgc -v /var/log/elasticsearch:/var/log/elasticsearch --name elasticsearch elasticsearch
复制代码
7.2、启动Kibana

  1. [root@docker ~]# docker run -itd -p 5601:5601 --network elk-kgc --name kibana kibana:latest
复制代码
7.3、启动Logstash

  1. [root@docker ~]# docker run -itd -p 5044:5044 --network elk-kgc -v /opt/logstash/conf:/opt/logstash/conf --name logstash logstash:latest
复制代码
7.4、启动Filebeat

  1. [root@docker ~]# docker run -itd --network elk-kgc -v /var/log/nginx:/var/log/nginx --name filebeat filebeat:latest
复制代码
八、Kibana Web管理



  • 由于kibana的数据必要从Elasticsearch中读取,以是必要Elasticsearch中有数据才能创建索引,创建不同的索引区分不同的数据集
8.1、访问Kibana



  • 浏览器输入http://192.168.93.165:5601访问kibana控制台。在Management中找到Indexpatterns,单击进去可以看到类似以下图片中的界面,填写www-bdqn-cn-pro-access-*

  • 在TimeFilterfieldname选项框中选中@timestemp这个选项。在kibana中,默认通过期间来排序。如果将日志存放入Elasticsearch的时间没有指定@timestamp字段内容,则Elasticsearch会分配接收到的日志时的时间作为该日志@timestamp的值

  • 单击**“Createindexpattern”**按钮,创建www-bdqn-cn-pro-access索引后界面结果如下

  • 单击“Discover”标签,大概会看不到数据。必要将时间轴选中为“Thisyear”才可以看到的内容

九、Kibana图示分析



  • 打开kibana的管理姐买你,单击“visualize”标签——Create a visualization,选择饼状图pie,添加索引www-bdqn-cn-por-access-*,点开SplitSlices,选中Terms,再从FieId选中messagekeyword,最后点击上面三角按钮即可生成可访问最多的5个公网IP地点


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表