ELK日志分析系统

448 阅读11分钟

ELK日志服务器

ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。

日志服务器的作用

  • 提高安全性
  • 集中存放日志

传统日志服务器的缺点

对日志的分析困难

为什么使用ELK

  • 一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
  • 一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

ELK日志分析组件

  • Elasticsearch
    • 是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。
  • Logstash
    • 作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给 Elasticsearch。
    • input:数据采集
    • filter:数据过滤
    • output:数据输出
  • Kibana
    • 在es集群中拿取数据,向用户展示图像化界面

日志处理步骤

  1. 将日志进行集中化管理
  2. 将日志格式化(Logstash) 并输出到Elasticsearch
  3. 对格式化后的数据进行索引和存储 (Elasticsearch)
  4. 前端数据的展示(Kibana)

扩展

Filebeat:轻量级的开源日志文件数据搜集器。常用于EFLK中,行的解析

filebeat结合logstash的好处:

  1. 通过 Logstash 具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻 Elasticsearch 持续写入数据的压力
  2. 从其他数据源(例如数据库,S3对象存储或消息传递队列)中提取
  3. 将数据发送到多个目的地,例如S3,HDFS(Hadoop分布式文件系统)或写入文件
  4. 使用条件数据流逻辑组成更复杂的处理管道

完整的日志系统特征

  • 收集:能够采集多种来源的日志数据
  • 传输:能够稳定的把日志数据解析过滤并传输到存储系统
  • 存储:存储日志数据
  • 分析:支持 UI 分析
  • 警告:能够提供错误报告,监控机制

ELK工作原理

  1. 在每一台机器上装上logstash搜集日志并且数据过滤的服务
  2. logstash1(端口5044搜集完数据之后,会将数据给消息队列(消息队列会将大数据进行排序,可以处理高并发),消息队列会知道数据是否处理完,处理完在给logstash2
  3. logstash2拿到数据之后,会将数据进行output给es(output里面会将数据指向es的端口+ip,数据会进行创建索引)
  4. es拿到数据之后会建立索引并进行存储,es数据中的数据会指向端口5061,给kibana
  5. kibana拿到数据会进行图形化展示到页面

image.png

实验

环境

  • Apache:192.168.42.11
  • node1(2核/4G):192.168.42.12
  • node2(2和/4G):192.168.42.13
systemctl stop firewalld
setenforce 0

ELK集群部署(node节点操作)

环境准备(node1、node2)

[root@node1 ~]# vim /etc/hosts
#添加配置域名解析
192.168.42.12 node1
192.168.42.14 node2

#查看就java环境
[root@node1 ~]# java -version

但是这边建议使用jdk,所以安装jdk
#将jdk的压缩包下载好
[root@node2 ~]# rpm -ivh jdk-8u201-linux-x64.rpm

[root@node2 ~]# vim /etc/profile.d/java.sh
#设置jdk环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

[root@node2 ~]# source /etc/profile.d/java.sh
#刷新文件,使其生效

image.png

image.png

image.png

image.png

部署elasticseaech软件

以node1为例

安装elasticseaech包

[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm
#安装elasticseaech包

[root@node1 opt]# systemctl daemon-reload
[root@node1 opt]# systemctl enable elasticsearch.service
#开启服务

image.png

修改elasticsearch配置文件

[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
#编辑配置文件之前,将配置文件备份
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
#配置文件里面的所有配置都是被注释掉的
17 cluster.name: my-elk-cluster
#取消17行注释,修改并指定集群名字
23 node.name: node1
#取消23行注释,指定节点名字:node1节点就写node1;node2节点就写node2
33 path.data: /data/elk_data
#取消33行注释,并指定数据存放路径
37 path.logs: /var/log/elasticsearch
#取消37行注释,并指定日志存放的路径
43 bootstrap.memory_lock: false
#取消43行的注释,修改为启动时候不锁定内存
55 network.host: 0.0.0.0
#取消55行注释,设置监听地址,0.0.0.0表示监听所有地址
59 http.port: 9200
#取消59行注释,ES 服务的默认监听端口为9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]
#取消68行注释,指定要发现的节点node1、node2

[root@node1 opt]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
#表示过滤出不是#号开头的行

image.png

image.png

image.png

image.png

创建数据存放的路径与授权,并且启动服务

[root@node1 opt]# mkdir -p /data/elk_data
#创建的数据存放目录
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data
#将目录的属主和属组修改为elasticsearch

[root@node1 opt]# systemctl start elasticsearch.service
#启动服务
[root@node1 opt]# lsof -i:9200
#查看端口是否启动成功
或者使用查看是否开启成功
[root@node1 opt]# netstat -antp | grep 9200
开启就立即查看的话是不会出现的,需要等一下,在会出现端口运行

image.png

image.png

查看节点信息

浏览器访问:http://192.168.42.12:9200 查看节点信息

浏览器访问:http://192.168.42.12:9200/_cluster/health?pretty 查看群集的健康情况,可以看到 status 值为 green(绿色), 表示节点健康运行。

浏览器访问: http://192.168.42.12:9200/_cluster/state?pretty 检查群集状态信息。

image.png

image.png

image.png

安装Elasticsearch-head插件

依然以node1为例

编译安装node

将node-v8.2.1.tar.gz安装包下载到opt目录下
[root@node1 opt]# yum install gcc gcc-c++ make -y
#安装依赖关系
[root@node1 opt]# tar zxvf node-v8.2.1.tar.gz
#解压
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
#检测环境是否可以编译安装
[root@node1 node-v8.2.1]# make && make install
#编译安装
编译安装的时间可能会有点长,耐心等待一下吧!!!

image.png

image.png

image.png

image.png

安装phantomjs(前端的框架)

下载phantomjs-2.1.1-linux-x86_64.tar.bz2到opt目录下
[root@node1 opt]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
#解压并指定路径
[root@node1 opt]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin
#备份

image.png

image.png

安装Elasticsearch-head数据可视化工具

下载elasticsearch-head.tar.gz到/opt目录
[root@node1 opt]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
#解压并指定目录
[root@node1 opt]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
#安装

image.png

image.png

修改Elasticsearch主配置文件

[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
#修改主配置文件
············#在末尾添加···········
http.cors.enabled: true
http.cors.allow-origin: "*"

解释:
http.cors.enabled: true		
#开启跨域访问支持,默认为 false
http.cors.allow-origin: "*"		
#指定跨域访问允许的域名地址为所有

[root@node1 ~]# systemctl restart elasticsearch
#重启服务

image.png

image.png

image.png

启动elasticsearch-head服务

启动时候必须在解压后的 elasticsearch-head 目录下启动服务,进程会读取该目录下的 gruntfile.js 文件,否则可能启动失败。
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
#放在后台,一直运行,按回车就好
[root@node1 elasticsearch-head]# netstat -natp |grep 9100
#查看端口

image.png

image.png

image.png

通过Elasticsearch-head查看Elasticsearch信息

浏览器访问:http://192.168.42.12:9100/ 如果看到群集健康值为 green 绿色,代表群集很健康。

在连接的那个框里面输入http:192.168.42.12:9200/ 点击链接就会出现

29fa9a74195470b4c69e6a1190524b5.png

插入索引,再查看

#插入一个测试索引,索引为 index-demo,类型为 test。
[root@node1 elasticsearch-head]# curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type:application/json' -d '{"user":"lisi","message":"helloween"}'

浏览器访问http://192.168.42.12:9100/
可以看见索引默认被分片5个,并且有一个副本。
点击“浏览数据”,会看见node1上有个index-demo,类型为test的数据信息

image.png

image.png

image.png

ELK Logstash部署(Apache节点)

安装Apache服务(httpd)

[root@apache ~]# yum -y install httpd
#安装httpd服务
[root@apache ~]# systemctl start httpd
#开启服务
[root@apache ~]# netstat -natp |grep 80
#查看端口是否开启

image.png

image.png

安装java环境和logstash

将安装包下载好
[root@apache ~]# rpm -ivh jdk-8u201-linux-x64.rpm
#安装
[root@apache ~]# vim /etc/profile.d/java.sh
#编辑环境变量,添加内容
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

[root@apache ~]# source /etc/profile.d/java.sh
#刷新

安装logstash
下载安装包到opt目录
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm
#安装
[root@apache opt]# systemctl start logstash.service
#开启
[root@apache opt]# systemctl enable logstash.service
#设置开机自启
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
#创建软连接

image.png

image.png

image.png

image.png

测试logstash

定义输入和输出流:
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
#输入采用标准输入,输出采用标准输出
输入:www.baidu.com
执行ctrl+c退出

使用rubydebug 输出详细格式显示,codec为一种编解码器
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
输入:www.baidu.com

使用 Logstash 将信息写入 Elasticsearch[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.42.12:9200"] } }'
输入:www.baidu.com

结果不在标准输出显示,而是发送至 Elasticsearch 中,可浏览器访问 http://192.168.10.13:9100/ 查看索引信息和数据浏览。

[root@apache ~]# logstash -e 'input { stdin{} } output {elasticsearch { hosts=>["192.168.42.12:9200"] } }'
#使用 Logstash 将信息写入 Elasticsearchwww.baidu.com
www.sina.com.cn
www.google.com
并不会出来输出结果,是发送到Elasticsearch中
浏览器访问http://192.168.42.12:9100/ 查看索引信息和数据

image.png

image.png

image.png

image.png

image.png

定义logstash配置文件

#修改 Logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中。
[root@apache ~]# chmod +r /var/log/messages
#给权限,让logstash可以读取日志
[root@apache ~]# vim /etc/logstash/conf.d/system.conf
#编辑配置文件
input {
  file{
    path =>"/var/log/messages"
    type =>"system"
    start_position =>"beginning"
      }
}
output {
  elasticsearch {
    hosts =>["192.168.42.12:9200"]
    index =>"system-%{+YYYY.MM.dd}"
  }
}

[root@apache ~]# systemctl restart logstash
#重启服务

浏览器访问http://192.168.42.12:9100/
查看索引信息

image.png

image.png

image.png

Kiabana部署(在Node1节点上操作)

安装kiabana并设置主配置文件

下载安装包到opt目录
[root@node1 opt]# rpm -ivh kibana-5.5.1-x86_64.rpm
#安装
[root@node1 opt]# vim /etc/kibana/kibana.yml
#编辑主配置文件
2 server.port: 5601
#取消2行注释,Kiabana 服务的默认监听端口为5601
7 server.host: "0.0.0.0"
#取消7行注释,设置 Kiabana 的监听地址,0.0.0.0代表所有地址
21 elasticsearch.url: "http://192.168.42.12:9200"
#取消21行注释,设置和Elasticsearch建立连接的地址和端口
30 kibana.index: ".kibana"
#取消30行注释,设置在elasticsearch中添加.kibana索引

[root@node1 opt]# systemctl start kibana.service
#启动
[root@node1 opt]# systemctl enable kibana.service
#开机自启
[root@node1 opt]# netstat -natp | grep 5601
#查看是否开启

image.png

image.png

image.png

image.png

验证kibana

浏览器访问http://192.168.42.12:5601

在页面Index name or pattern下面的框里输入
system-*
#表示在索引名中输入之前配置的 Output 前缀“system”
回车,创建,在点击Discover按钮可以查看到图表显示的日志信息
也可以分类显示,在“Available Fields”中的“host”,点击后面的“add”,就可以看见按照“host”筛选后的结果

image.png

image.png

image.png

image.png

image.png

image.png

image.png

将Apache服务器的日志添加到es集群并通过kibana显示(Apache节点)

[root@apache ~]# vim /etc/logstash/conf.d/apache_log.conf
#编辑一个日志文件
input {
    file{
        path => "/etc/httpd/logs/access_log"
        type => "access"
        start_position => "beginning"
    }
    file{
        path => "/etc/httpd/logs/error_log"
        type => "error"
        start_position => "beginning"
    }
}
output {
    if [type] == "access" {
        elasticsearch {
            hosts => ["192.168.42.12:9200"]
            index => "apache_access-%{+YYYY.MM.dd}"
        }
    }
        if [type] == "error" {
        elasticsearch {
            hosts => ["192.168.42.12:9200"]
            index => "apache_error-%{+YYYY.MM.dd}"
        }
    }
}

[root@apache ~]# cd /etc/logstash/conf.d/
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
#开启

image.png

image.png

image.png

验证

浏览器访问http://192.168.42.12:9100 查看所有是否创建成功 创建了error索引

image.png

浏览器访问http://192.168.42.12:5601 登录kibana

image.png

image.png

image.png

image.png

image.png

ELFK

ELFK部署

环境

  • node1(2核/4G):192.168.42.12
  • node2(2核/4G):192.168.42.13
  • Apache:192.168.42.11
  • filebeat:192.168.42.14

安装filebeat和设置filebeat主配置文件(node1节点)

下载filebeat安装包到opt目录
[root@node1 opt]# tar zxvf filebeat-6.6.0-linux-x86_64.tar.gz
#解压
[root@node1 opt]# mv filebeat-6.6.0-linux-x86_64 /usr/local/filebeat

[root@node1 opt]# cd /usr/local/filebeat/
[root@node1 filebeat]# vim filebeat.yml
#编辑主配置文件
··············
15 filebeat.prospectors:
#修改15行
24   enabled: true
#修改24行,从日志文件中读取消息
27   paths:
28     - /var/log/messages
#指定监控的日志文件
29 fields:
#可以使用 fields 配置选项设置一些参数字段添加到 output 中
30   service_name: filebeat
31   log_type: log
32   service_id: 192.168.42.14

--------------Elasticsearch output--------------
将Elasticsearch output那段全部注释掉

----------------Logstash output-----------------
165 output.logstash:
167   hosts: ["192.168.42.11:5044"]
#指定 logstash 的 IP 和端口

启动filebeat
[root@node1 filebeat]# ./filebeat -e -c filebeat.yml

注意,这边先不要启动filebeat,先启动logstash,再启动filebeat

image.png

image.png

image.png

image.png

image.png

Apache(含有logstash)节点上新建一个 Logstash 配置文件

[root@apache conf.d]# cd /etc/logstash/conf.d/
[root@apache conf.d]# vim logstash.conf
#编辑一个logstash文件
input {
    beats {
        port => "5044"
    }
}
output {
    elasticsearch {
        hosts => ["192.168.10.12:9200"]
        index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
    }
    stdout {
        codec => rubydebug
    }
}

[root@apache conf.d]# logstash -f logstash.conf
#启动logstash

[root@node1 filebeat]# ./filebeat -e -c filebeat.yml
#开启filebeat

image.png

image.png

image.png

image.png

测试

浏览器访问http://192.168.42.12:5601 登录kibana,按照之前查看的方法,查看索引“filebeat-*”,查看图表信息

95d1ce53c771058017d81c8204b2539.png

95d1ce53c771058017d81c8204b2539.png