前言:
日志分析是运维工程师解决系统故障,发现问题的主要手段。日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存在不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志,即繁琐又效率低下。为此,我们可以使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于更高要求的查询、排序和统计等,再加上庞大的机器数量,使用这样的方法依然难免有点力不从心。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站:https://www.elastic.co/products
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤,并将其存储,供以后使用(如,搜索)。 Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供友好的日志分析Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
一,ELK日志分析系统的简介
elk是有多个组件主从的一套日志分析系统
1、主要组件
Elasticsearch Logstash Kibana
2、日志处理步骤
(1).将APP servers的日志进行集中化管理到Logstash agent
(2).将日志格式化(Logstash)并输出到Elasticsearch cluster
(3).对格式化后的数据进行索引和存储(Elasticsearch)
(4)前端数据的展示(Kibana)
(5)可以在线查看界面化展示  Logstash 收集APP server产生的log,然后存放到Elasticsearch集群节点中
kibana从Elasticsearch集群节点中查询数据生成图表,再返回给Brower
二、Elasticsearch介绍
1、Elasticsearch是什么
简写es,es是一个高扩展、开源的全文检索和分析引擎,它可以准实时地快速存储、搜索、分析海量的数据。
提供了一个分布式多用户能力的全文搜索引擎 是一个基于Lucene的搜索服务器 基于restful web接口 使用java开发 作为apache许可条款下的开放源码发布,是第二流行的企业搜索引擎 被设计用于云计算中,能够达到实时搜索、稳定、可靠、快速、安装实用方便的需求
2、Elasticsearch专业术语
(1)接近实时(NRT)
Elasticsearch是一个接近即时的搜索平台,从索引一个文档知道这个文档能够被搜索到的过程中有一个轻微的延迟(通常是1S)
(2)集群(cluster)
由一个及其以上的节点组织在一起,它们共同持有整个数据,并一起提供索引和搜索功能
其中一个节点为主节点,这个节点是可以通过选举产生,并提供跨节点的联合索引和搜索的功能
集群有一个唯一标识的名字,默认是elaticsearch
集群名字很重要,每个节点是基于集群名字加入到其集群中;因此,要确保集群的唯一性,在不同环境中使用不同的集群名字
一个集群只可以有一个节点,建议在配置elasticsearch时,配置成集群模式
(3)节点(node)
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能
像集群一样,节点之间可是通过名字来标识区分,默认是在节点启动时随机分配的字符名
当然,你可以自己定义,该名字很重要,起到在集群中定位到对应的节点
节点可以通过指定集群名字来加入到集群中,默认情况下,每个节点被设置成加入到elasticsearch集群。
如果启动了多个节点,假设能够自动发现对方,他们将会自动组建一个名为elastisearch的集群
(4)索引(index)——索引(库)——类型(表)——文档(记录)
一个索引就是一个拥有几分相似特征的文档的集合
比如说,你可以有一个客户数据的索引、一个产品目录的索引、还有一个订单数据的索引
一个索引用一个名字来标识(必须全部是小写字母组合),并且当我们要对相应的索引中的文档进行索引、收缩、更新和删除的时候,都要用到这个名字
在一个集群中,可以定义多个索引
(4)类型(type)
在一个索引中,你可以定义一种或多种类型
一个类型是你的索引的一个逻辑上的分类分区,其寓意完全由你来定义
通常,会为具有一组共同字段的文档定义一个类型
比如:我们假设运营一个博客平台并且将所有的数据存储到一个索引中,在这个索引中,你可以为用户数据定义一个类型,为博客数据定义一个类型,也可以为评论数据定义另一个类型
(5)文档(Document)
一个文档是一个可被索引的基础信息单元
比如:你可以拥有一个客户的文档,某一个产品的文档;文档以JSON(Javascript Object Notation)格式来表示,json是一个通用的互联网数据交互模式
在一个index/type内,你可以存储任意多的文档
注意:虽然一个文档在物理上位于一个索引内,但是实际上一个文档必须在一个索引内可以被索引和分配一个类型
(6)分片和副本 (shards & replicas)
在实际情况下,索引存储的数据可能超过单个节点的硬件设置
比如十亿个文档需要1TB空间存储,可能不适合存储在单个节点上,读写被限制在单个节点;从单个节点搜索请求也太慢了
为了解决这个问题,elasticsearch集群提供将索引分割开,进行分片的功能,当创建索引时,可以定义想要分片的数量,每一个分片就是一个全功能的独立的索引,可以位于集群中的任何节点上
3、 分片的两个最主要原因:
1.可以进行水平分割横向扩展,增大存储量
2.分布式并行跨分片操作,提高性能和吞吐量
分布式分片的机制和搜索i请求的文档如何汇总由elasticsearch控制,这些对用户来说是透明的 网络问题等其他不可控因素可以在任何时候不期而至,为了集群的健壮性,可以做一个故障切换机制,无论出现何种故障以防止分片或者节点不可用,为此,elasticsearch可以将索引分片复制一份或者多分,这被称之为分片副本
4 、开启分片副本的主要原因
1.高可用性,以应对分片或者节点故障,处于这个原因,分片副本要在不同节点上
2.提高IO性能,增大吞吐量,搜索可以并行在所有副本执行
总之,每个索引可以被分成多个分片,一个索引也可以被复制0次或者多次
一旦复制了,每个索引就有了主分片(可以作为复制源的原始分片)和复制分片(主分片的拷贝)之分 分片和副本的数量可以在索引创建的时候指定,在索引创建之后,你可以在任何时候动态改变副本的数量,但是你事后无法改变分片的数量
ES默认为一个索引创建5个主分片, 并分别为其创建一个副本分片. 也就是说每个索引都由5个主分片成本, 而每个主分片都相应的有一个copy 这意味着,如果你的集群中至少有两个节点的情况下,你的索引将会有5个主分片和另外对应的5个副本分片(为完全拷贝),这样的话每个索引总共就有10个分片
文献参考:【Elasticsearch内部分片及分片处理机制介绍】https://blog.csdn.net/weixin_44558760/article/details/89095770
三、Logstash介绍
1、 Logstash概述
一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出 工作思路:数据输入(collect)、数据加工(如过滤、改写等enrich)以及数据输出(transport) 由LRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上。 不同于分离的代理端(agent)或主机端(server),Logstash可配置单一的代理端(agent)与其他开源软件结合,以实现不同的功能
2 、Logstash主要组件
(1)Shipper:日志收集 负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来 通常,远程代理端(agent)只需要运行这个组件即可
(2)Indexer:日志存储 负责接受日志并写入到本地文件
(3)Broker:日志hub 负责链接多个shipper和对应数目的indexer
(4)Search and Storage 允许对事件进行搜索和存储
(5)Web Interface 基于web的展示界面
以上组件在lLogstash架构中可以独立部署,因此提供了很好的集群扩展性
3、 Logstash主机分类
代理主机(agent):作为事件的传递者(shipper),将各种日志数据发送到中心主机;只需要运行logstash代理程序 中心主机(central host):可运行包括中间转发器(broker)、索引器(indexer)、搜索和存储器(search & storage)、web界面端(web interface)在内的各个组件,以实现对日志数据地接收、处理和存储
四:Kibana介绍
1、 Kibana概述
一个针对Elasticsearch的开源分析及可视化平台
搜索、查看存储在Elasticsearch索引中的数据
通过各种图标进行高级数据分析及展示
让海量数据更容易理解
操作简单,基于浏览器地用户界面就可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态
设置安装Kibana非常简单,无需编写代码,几分钟内就可以完成Kibana安装并启动Elasticsearch监测
2 、Kibana主要功能
Elasticsearch无缝之集成。Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化加入Elasticsearch索引,Kibana还充分利用了Elasticsearch强大的搜索和分析功能
整合数据,复杂数据分析;根据海量数据创建柱形图、折线图、三代泥土、直方图、饼图和地图;提升了Elasticsearch地分析能力,更够更加智能化地分析数据,执行数学转化并且根据要求对数据切割分块 让更多团队成员受益;强大的数据可视化让各个业务岗位都可以直观了解数据 接口灵活,分享更容易;使用Kibana可以更加方便地创建保存和分享数据,并将可视化数据快速交流 配置简单,可视化多数据源;Kibana地配置和启动非常简单,用户体验友好,Kibana自带web服务器,可以快速运行;kibana可以非常方便地把来自logstash、ES-hadoop、Beats或第三方技术整合到Elasticsearch,支持地第三方技术包括apacheflume、fluentd等 简单数据导出;Kibana可以方便地导出感兴趣地数据,与其他数据融合后快速建模分析,发现新结果
总结:各主键作用
Logstash 收集APP server产生的log,然后存放到Elasticsearch集群节点中
kibana从Elasticsearch集群节点中查询数据生成图表,再返回给Brower
总结:默认端口
kibana 5601 logstash 9600 input 4560 Elasticsearch 9200 
五,实验部分
实验环境 node1:192.168.100.8 #安装 Elasticsearch 、Kibana node2 :192.168.100.7 #安装Elasticsearch apache :192.168.100.6 三台centos7服务器,配置安装ELK日志分析系统 安装集群方式,两个Elasticsearch节点,并监控apache服务器日志
1、修改主机名
hostnamectl set-hostname node1
su
hostnamectl set-hostname node2
su
hostnamectl set-hostname apache
su
2、修改hostname文件
[root@Node1 ~]# vim /etc/hosts
192.168.100.8 node1
192.168.100.7 node2
192.168.100.6 apache
#复制到其他两台主机上
[root@node1 ~]# scp /etc/hosts root@192.168.100.7:/etc/
[root@node1 ~]# scp /etc/hosts root@192.168.100.6:/etc/
3、 各个节点查看java环境(安装java-1.8.0版)
[root@node1 ~]# java -version
openjdk version "1.8.0_181" #已经安装
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@node1 ~]# yum install -y java-1.8.0 #若无,可执行安装
4.部署Elasticsearch
4.1 、node1节点上安装启动elasticsearch
将 elasticsearch-5.5.0.rpm 上传到/opt
[root@node1 opt]#cd /opt
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm #安装
[root@node1 opt]# systemctl daemon-reload #开启
[root@node1 opt]# systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
4.2、修改配置文件
[root@node1 opt]# cd /etc/elasticsearch/
[root@node1 elasticsearch]# ls
elasticsearch.yml jvm.options log4j2.properties scripts
[root@node1 elasticsearch]# cp elasticsearch.yml elasticsearch.yml.bak #修改配置文件前先备份
[root@node1 elasticsearch]#vim elasticsearch.yml
修改以下内容
17 cluster.name: my-elk-cluster
###集群名字
23 node.name: node1
###节点名字
33 path.data: /data/elk_data
###数据存放路径
37 path.logs: /var/log/elasticsearch/
###日志存放路径
43 bootstrap.memory_lock: false
### 启动的时候不锁定内存
55 network.host: 0.0.0.0
### 指定提供服务地IP地址,0.0.0.0为所有IP
59 http.port: 9200
###开启端口号
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]
### 集群发现通过单播实现,指定集群node名字
过滤一下刚刚修改的内容,检查一遍
[root@node1 elasticsearch]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
查看用户是否建立(安装rpm时,程序用户也被创建)
[root@node1 ~]# cat /etc/passwd | grep "elasticsearch"
elasticsearch:x:987:981:elasticsearch user:/home/elasticsearch:/sbin/nologin
4.3、创建指定目录并授权
[root@node1 elasticsearch]# cd
[root@node1 ~]# mkdir -p /data/elk_data /var/log/elasticsearch
[root@node1 ~]# chown elasticsearch:elasticsearch /data/elk_data /var/log/elasticsearch
4.4重启服务,查看端口
[root@node1 ~]# systemctl restart elasticsearch.service
[root@node1 ~]# netstat -natp |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 32108/java
4.5真机游览器上查看节点信息
登录node1的9200端口 
4.6 在node2上部署elasticsearch
将 elasticsearch-5.5.0.rpm 上传到/opt 安装步骤与node1基本相同,但节点名称修改为node2
[root@node1 opt]# cd /etc/elasticsearch/
[root@node1 elasticsearch]# cp elasticsearch.yml elasticsearch.yml.bak #修改配置文件前先备份
[root@node1 elasticsearch]#vim elasticsearch.yml
修改以下内容
17 cluster.name: my-elk-cluster
###集群名字
23 node.name: node2
###节点名字
33 path.data: /data/elk_data
###数据存放路径
37 path.logs: /var/log/elasticsearch/
###日志存放路径
43 bootstrap.memory_lock: false
### 启动的时候不锁定内存
55 network.host: 0.0.0.0
### 指定提供服务地IP地址,0.0.0.0为所有IP
59 http.port: 9200
###开启端口号
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]
### 集群发现通过单播实现,指定集群node名字
其他开启服务等步骤和node1的一样
登录node2的9200端口查看 
4.7 查看集群健康状态
输入完整url,192.168.100.8:9200/_cluster/health?pretty 
4.8查看集群状态信息
登录192.168.100.8:9200/_cluster/state?pretty 
5、安装elasticsearch-head插件
es安装成功,但我们发现查看集群信息信息不是很便捷,这里我们安装elasticsearch-head插件,观看管理集群会更方便
5.1 node1和node2节点配置,先安装相关node组件包
将node-v8.2.1.tar.gz上传到/opt
[root@node1 ~]# cd /opt/
[root@node1 ~]# tar xzvf node-v8.2.1.tar.gz
[root@node1 ~]# cd /opt/node-v8.2.1/
[root@node1 ~]# yum -y install gcc gcc-c++ make cmake
[root@node1 ~]#cd /opt/node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j3 && make install
安装时间有点长,这个时候把node2的也安装一下
5.2两个node节点都安装phantomjs
上传phantomjs-2.1.1-linux-x86_64.tar.bz2到/opt
前端框架
cd /opt
[root@node1 opt]# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 opt]# cd /opt/phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin/
5.3环境包安装完毕,安装elasticsearch-head
上传elasticsearch-head.tar.gz到/opt 下 两个node节点都安装
[root@node1 opt]# cd /opt
[root@node1 opt]# tar zxvf elasticsearch-head.tar.gz
[root@node1 opt]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# ls
Dockerfile package.json
Dockerfile-alpine package-lock.json
elasticsearch-head.sublime-project plugin-descriptor.properties
Gruntfile.js proxy
grunt_fileSets.js README.textile
index.html _site
LICENCE src
node_modules test
[root@node1 elasticsearch-head]# npm install
安装另一个节点
5.4、修改两个节点配置文件

[root@node1 elasticsearch-head]# cd
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true #开启跨域访问支持
http.cors.allow-origin: "*" #跨域允许的域名地址
[root@node1 ~]# systemctl restart elasticsearch.service
节点2也一样修改
5.5 启动elasticsearch-head服务
两个节点都做
[root@node1 ~]# cd /opt/elasticsearch-head/
[root@node1 elasticsearch-head]# ls
Dockerfile Gruntfile.js LICENCE package-lock.json README.textile test
Dockerfile-alpine grunt_fileSets.js node_modules plugin-descriptor.properties _site
elasticsearch-head.sublime-project index.html package.json proxy src
[root@node1 elasticsearch-head]# npm run start &
[1] 10264
[root@node1 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /opt/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100 #回车
[root@node1 elasticsearch-head]# netstat -lnupt | grep 9100
[root@node1 elasticsearch-head]# netstat -lnupt | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 79596/grunt
[root@node1 elasticsearch-head]# netstat -lnupt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 79437/java
节点2同样操作
5.6、访问验证
登录node1  修改链接为node1的9200端口  通过按钮,可以查看两个节点的健康状态状态和集群状态 
5.6 测试创建索引
查看索引,默认5个分片,1个副本  node1创建
[root@node1 elasticsearch-head]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}' #输出这个命令会出现以下内容,显示创建成功
{
"_index" : "index-demo",
"_type" : "test",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"created" : true
}

6 apache服务端的logstash
在第三台机器,利用logstash搜集一些日志,并输出到elasticsearch中
6.1安装httpd
[root@apache ~]# systemctl stop firewalld
[root@apache ~]# systemctl disable firewalld
[root@apache ~]# setenforce 0
[root@apache ~]# yum install -y httpd
[root@apache ~]# systemctl start httpd
6.2 安装logstash
logstash-5.5.1.rpm包上传到/opt
cd /opt
rpm -ivh logstash-5.5.1.rpm
systemctl start logstash.service
systemctl enable logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
6.3 测试apache端和es之间功能对接是否正常
Logstash这个命令测试 字段描述解释: ● -f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash ●-e 后面跟着字符串 该字符串可以被当做logstash的配置(如果是” ”,则默认使用stdin做为输入、stdout作为输出) ● -t 测试配置文件是否正确,然后退出
输入采用标准输入,输出采用标准输出
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path
22:15:59.401 [main] INFO logstash.setting.writabledirectory - Creating directory {:setting=>"path.queue", :path=>"/usr/share/logstash/data/queue"}
22:15:59.405 [main] INFO logstash.setting.writabledirectory - Creating directory {:setting=>"path.dead_letter_queue", :path=>"/usr/share/logstash/data/dead_letter_queue"}
22:15:59.428 [LogStash::Runner] INFO logstash.agent - No persistent UUID file found. Generating new UUID {:uuid=>"562e07f8-d895-4b5e-b649-fee3c0e372b8", :path=>"/usr/share/logstash/data/uuid"}
22:15:59.687 [[main]-pipeline-manager] INFO logstash.pipeline - Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
22:15:59.797 [[main]-pipeline-manager] INFO logstash.pipeline - Pipeline main started
The stdin plugin is now waiting for input:
22:15:59.896 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
wwww.baidu.com ##输入www.baidu.com
2021-08-02T14:16:33.992Z apache wwww.baidu.com
www.sina.com ##输入www.sina.com
2021-08-02T14:17:03.984Z apache www.sina.com
[root@apache opt]#
6.4 rubydebug显示详细输出
codec为一种编码器
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
......
22:23:11.070 [[main]-pipeline-manager] INFO logstash.pipeline - Starting pipeline {"id"=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>500}
22:23:11.108 [[main]-pipeline-manager] INFO logstash.pipeline - Pipeline main started
The stdin plugin is now waiting for input:
22:23:11.182 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com #输入www.baidu.com
{
"@timestamp" => 2021-08-02T14:24:03.931Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
[root@apache opt]#
6.5 使用logstash将信息写入到elsticsearch
对接到node1的9200端口
[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.100.8:9200"] } }'
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
...............
22:27:02.116 [[main]-pipeline-manager] INFO logstash.outputs.elasticsearch - Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://192.168.100.8:9200/, :path=>"/"}
22:27:02.232 [[main]-pipeline-manager] WARN logstash.outputs.elasticsearch - Restored connection to ES instance {:url=>#<Java::JavaNet::URI:0x657e173>}
22:27:02.236 [[main]-pipeline-manager] INFO logstash.outputs.elasticsearch - Using mapping template from {:path=>nil}
22:27:02.484 [[main]-pipeline-manager] INFO logstash.outputs.elasticsearch - Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>50001, "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"_default_"=>{"_all"=>{"enabled"=>true, "norms"=>false}, "dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date", "include_in_all"=>false}, "@version"=>{"type"=>"keyword", "include_in_all"=>false}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}}
22:27:02.493 [[main]-pipeline-manager] INFO logstash.outputs.elasticsearch - Installing elasticsearch template to _template/logstash
.......
The stdin plugin is now waiting for input:
22:27:02.694 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com
www.sina.com
[root@apache opt]#
6.6 登录验证
登录到192.168.100.8:9100,出现游览记录 
6.7、将logstash与系统日志文件对接配置
Logstash配置文件主要由三部分组成:input、output、filter(根据需要)
[root@apache ~]# chmod o+r /var/log/messages
[root@apache ~]# ll /var/log/messages
-rw----r-- 1 root root 1171900 8月 15 09:42 /var/log/messages
#配置文件中定义的是收集系统日志(system)
[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.100.8:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
[root@apache opt]# systemctl restart logstash.service
查看,节点状态下出现了系统日志内容 
7、在node1节点上面安装Kibana
将kibana-5.5.1-x86_64.rpm 上传到/opt
7.1 安装
[root@node1 ~]# cd /opt/
[root@node1 opt]# rpm -ivh kibana-5.5.1-x86_64.rpm
7.2修改配置文件,启动
[root@node1 opt]# cd /etc/kibana/
[root@node1 kibana]# cp -p kibana.yml kibana.yml.bak
[root@node1 kibana]# vim kibana.yml
2 server.port: 5601 #开启端口
7 server.host: "0.0.0.0" #监听IP
20 elasticsearch.url: "http://192.168.100.8:9200" #指定node1
elasticsearch路径
29 kibana.index: ".kibana" #添加索引
[root@node1 kibana]# systemctl start kibana.service
[root@node1 kibana]# systemctl enable kibana.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.
[root@node1 kibana]# netstat -natp | grep 5601
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 83007/node
[root@node1 kibana]#
7.3 登录Kibana的端口查看
192.168.100.8:5601  创建索引system-* 
查看 
7.4配置logstash去收集apache日志文件
对接apache的日志文件(access、error)
[root@apache opt]# cd /etc/logstash/conf.d/
[root@apache conf.d]# touch apache_log.conf
[root@apache conf.d]# vim 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.226.128:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.226.128:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf #开启

7.5查看elasticsearch

7.6 查看kibana
创建apache_error-*和apache_access-*索引
 
 切换索引 
|