目录
一、ELK简介
1.2 ELK工作原理
二、为什么要使用 ELK
三、Logstash
1、Logstash简介
2、Logstash的主要组件
四、Kibana
1、Kibana简介
2、Kibana主要功能
五、ELK的工作原理
六、配置ELK日志分析系统
1、部署环境
1.1 了解架构部署
2、在节点1上部署ElasticSearch(ES)
2.1 配置域名及安装 JDK并设置JDK的环境变量
2.2 部署安装Elasticsearch软件
2.3 配置Elasticsearch主配置文件
2.4、创建数据存放路径并授权并开启服务
2.5 查看node1节点信息
3、在节点2上部署ElasticSearch (ES)
3.1 配置域名及安装 JDK并设置JDK的环境变量
3.2 部署安装Elasticsearch软件
3.3 配置Elasticsearch主配置文件
3.4、创建数据存放路径并授权并开启服务
3.5 查看node2节点信息
4、在节点1安装Elasticsearch-head插件
4.1 编译安装 node
4.2 安装phantomjs
4.3、安装 Elasticsearch-head 数据可视化工具
4.4 修改Elasticsearch主配置文件
4.5 启动elasticsearch-head服务
4.6 通过Elasticsearch-head 查看ES信息
4.7 插入索引
5、在节点2安装Elasticsearch-head插件
5.1 编译安装 node
5.2 安装phantomjs
5.3、安装 Elasticsearch-head 数据可视化工具
5.4 修改Elasticsearch主配置文件
5.5 启动elasticsearch-head服务
5.6 通过Elasticsearch-head 查看ES信息
6、 部署 Logstash服务(Apache节点操作)
6.1 安装logstash
6.2 安装java环境(jdk)
6.3 安装logstash
6.4 测试logstash(端口5044)
6.5 使用 rubydebug 输出详细格式显示,codec 为一种编解码器
6.6 使用 Logstash 将信息写入 Elasticsearch 中
6.7 定义logstash配置文件 做对接配置(logstas—>ES)
6.8 浏览器验证查看索引信息
7、 部署Kibana(在node1节点上操作)
7.1 安装kibana
7.2、设置Kibana的主配置文件
7.3 启动kibana服务
7.4、验证Kibana
7.5、将 Apache 服务器的日志(访问的、错误的)添加到 Elasticsearch 并通过 Kibana 显示
ElasticSearch:
ElasticSearch是基于Lucene (一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。
ElasticSearch是用Java开发的,可通过RESTful Web 接口,让用户可以通过浏览器与 ElasticSearch通信。
ElasticSearch是一个实时的、分布式的可扩展的搜索引擎,允许进行全文、结构化搜索
ElasticSearch通常用于索引和搜索大容量的日志数据,也可用于搜索许多不同类型的文档。
Kiabana:
Kibana通常与ElasticSearch一起部署,Kibana 是 BlasticSearch 的一个功能强大的数据可视化Dashboard,
Kibana提供图形化的 Web 界面来浏览ElasticSearch日志数据,可以用来汇总、分析和搜索重要数据。
Logstash:
Logstash作为日志数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给ElasticSearch。
Logstash 由 Ruby 语言编写,运行在Java 虚拟机(JVM)上,是一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出。Logstash具有强大的插件功能,常用于日志处理。
Filebeat:
Filebeat轻量级的开源日志文件数据搜集器。
Filebeat通常在需要采集数据的客户端安装 Filebeat,并指定目录与日志格式,Filebeat 就能快速收集数据,并发送给 logstash 进行解析,或是直接发给 ElasticSearch 存储。
Filebeat性能上相比运行于JVM上的 logstash 优势明显,是对它的替代。常应用于EFLK架构当中。
Filebeat结合logstash带来好处:
Fluentd:
Fluentd是一个流行的开源数据收集器。由于logstash 太重量级的缺点,Logstash 性能低、资源消耗比较多等问题,随后就有Fluentd的出现。
Fluentd相比较logstash,Fluentd更易用、资源消耗更少、性能更高,在数据处理上更高效可靠,受到企业欢迎,成为logstash的一种替代方案,常应用于EFK架构当中。
Fluentd在Kubernetes集群中也常使用EFK作为日志数据收集的方案。
Fluentd在Kubernetes集群中一般是通过DaemonSet来运行的,以便它在每个Kubernetes 工作节点上都可以运行一个Pod。
Fluentd它通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到ElasticSearch集群,在该集群中对其进行索引和存储。
APPServer集群→logstash Agent 采集器→ElasticSearch Cluster→Kibana Server→Browser
input filter output
采集 过滤/格式化 输出
Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。简单来说,进行日志处理分析,一般需要经过以下步骤:
1)将日志进行集中化管理(beats)
beats包含四种工具:
Packetbeat(搜集网络流量数据)
Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
Filebeat(搜集文件数据)轻量级的工具(相较于logstash)
Winlogbeat(搜集 Windows 事件日志数据)
2)将日志格式化(logstash)
3)对格式化后的数据进行索引和存储(elasticsearch)
4)前端数据的展示(kibana)
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。定期对日志做巡检,根据报错警告来制定对策。
往往单台机器的日志我们使用grep、awk等工具就能基本实现简单分析,但是当日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理。
例如:开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
—款强大的数据处理工具
可实现数据传输、格式处理、格式化输出
数据输入(从业务输入)、数据加工(如过滤、改写等)以及数据输出(输出到Elasticsearch群集)
shipper:日志收集者,负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可
indexer:日志存储者,负责接收日志并写入到本地文件
broker:日志hub,负责连接多个shipper和多个indexer
search and storage:允许对事件进行搜索和存储
web interface:基于Web的展示界面
以上组件在Logstash架构中可以独立部署,因此提供了很好的集群扩展性
一个针对Elasticsearch的开源分析及可视化平台;
搜索、查看存储在Elasticsearch索引中的数据;
通过各种图标进行高级数据分析及展示;
让海量数据更容易理解;
操作简单,基于浏览器地用户界面就可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态;
设置安装Kibana非常简单,无需编写代码,几分钟内就可以完成Kibana安装并启动Elasticsearch监测。
(1)Elasticsearch无缝之集成。Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化数据加入Elasticsearch索引。Kibana还充分利用了Elasticsearch强大的搜索和分析功能。
(2)整合数据:Kibana能够更好地处理海量数据,并据此创建柱形图、折线图、散点图、直方图、饼图和地图。
(3)复杂数据分析:Kibana提升了Elasticsearch分析能力,能够更加智能地分析数据,执行数学转换并且根据要求对数据切割分块。
(4)让更多团队成员受益:强大的数据库可视化接口让各业务岗位都能够从数据集合受益。
(5)接口灵活,分享更容易:使用Kibana可以更加方便地创建、保存、分享数据,并将可视化数据快速交流。
(6)配置简单:Kibana的配置和启用非常简单,用户体验非常友好。Kibana自带Web服务器,可以快速启动运行。
(7)可视化多数据源:Kibana可以非常方便地把来自Logstash、ES-Hadoop、Beats或第三方技术的数据整合到Elasticsearch,支持的第三方技术包括Apache Flume、Fluentd等。
(8)简单数据导出:Kibana可以方便地导出感兴趣的数据,与其它数据集合并融合后快速建模分析,发现新结果。
(1)在所有需要收集日志的服务器上部署Logstash,或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署Logstash。
(2)Logstash收集日志,将日志格式化并输出到ElasticSearch群集中。
(3)ElasticSearch对格式化后的数据进行索引和存储。
(4)Kibana从ES群集中查询数据生成图表,并进行前端数据的展示。
主机名 | ip地址 | 主要软件 |
---|---|---|
node1 | 192.168.187.48 | ElasticSearh、Kibana |
node2 | 192.168.187.68 | ElasticSearh |
apache | 192.168.187.78 | Logstash、Apache |
日志分析系统原理
首先有Apache产生大量的日志在本机中,那么Logstash就会input获取日志,然后进行Filter Plugin(过滤日志和格式处理),最后将处理好的日志outpu发送日志到ES的cluster集群中。
ES将收到的日志进行索引和存储。
最后可以使用Kibana进行查看分析日志。
上传jdk-8u201-linux-x64.rpm 到/opt/ELK
解压rpm -ivh jdk-8u201-linux-x64.rpm
#查看当前系统环境下java版本
java -version
#设置JDK的环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
#加载生效、查看版本
source /etc/profile.d/java.sh
java -version
cd /opt/ELK
上传 压缩包 elasticsearch-5.5.0.rpm
rpm -ivh elasticsearch-5.5.0.rpm 解包
cd /etc/elasticsearch/
cp elasticsearch.yml elasticsearch.yml.bak 备份es配置文件
vim /etc/elasticsearch/elasticsearch.yml
#--17--取消注释,指定集群名字
cluster.name: yang
#--23--取消注释,指定节点名字:Node1节点为node1,Node2节点为node2
node.name: node1
#--33--取消注释,指定数据存放路径
path.data: /data/elk_data
#--37--取消注释,指定日志存放路径
path.logs: /var/log/elasticsearch/
#--43--取消注释,改为在启动的时候不锁定内存
bootstrap.memory_lock: false
#--55--取消注释,设置监听地址,0.0.0.0代表所有地址
network.host: 0.0.0.0
#--59--取消注释,ES 服务的默认监听端口为9200
http.port: 9200
#--68--取消注释,集群发现通过单播实现,指定要发现的节点 node1、node2
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
grep -v "^#" /etc/elasticsearch/elasticsearch.yml
#过滤出有效的配置文件
mkdir -p /data/elk_data #创建数据存放路径
chown elasticsearch:elasticsearch /data/elk_data/ #修改属主属组
systemctl start elasticsearch #开启服务
netstat -antp | grep 9200 #查看端口
systemctl enable --now elasticsearch.service #立即开启服务
netstat -antp | grep 9200
在浏览器查看节点信息
浏览器检测集群健康,查看集群状态
192.168.100.20:9200/_cluster/health?pretty
vim /etc/hosts
192.168.187.48 node1
192.168.187.68 node2
192.168.187.78 httpd
上传jdk-8u201-linux-x64.rpm 到/opt/ELK
解压rpm -ivh jdk-8u201-linux-x64.rpm
#查看当前系统环境下java版本
java -version
#设置JDK的环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
#加载生效、查看版本
source /etc/profile.d/java.sh
java -version
cd /opt/ELK
上传 压缩包 elasticsearch-5.5.0.rpm
rpm -ivh elasticsearch-5.5.0.rpm 解包
cd /etc/elasticsearch/
cp elasticsearch.yml elasticsearch.yml.bak 备份es配置文件
vim /etc/elasticsearch/elasticsearch.yml
#--17--取消注释,指定集群名字
cluster.name: yang
#--23--取消注释,指定节点名字:Node1节点为node1,Node2节点为node2
node.name: node2
#--33--取消注释,指定数据存放路径
path.data: /data/elk_data
#--37--取消注释,指定日志存放路径
path.logs: /var/log/elasticsearch/
#--43--取消注释,改为在启动的时候不锁定内存
bootstrap.memory_lock: false
#--55--取消注释,设置监听地址,0.0.0.0代表所有地址
network.host: 0.0.0.0
#--59--取消注释,ES 服务的默认监听端口为9200
http.port: 9200
#--68--取消注释,集群发现通过单播实现,指定要发现的节点 node1、node2
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
把节点1的文件复制到节点2
scp elasticsearch.yml [email protected]:/etc/elasticsearch/elasticsearch.yml
grep -v "^#" /etc/elasticsearch/elasticsearch.yml 查看配置文件有效信息
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/
systemctl start elasticsearch
systemctl enable --now elasticsearch.service
netstat -antp | grep 9200
192.168.187.68:9200 浏览器查看
浏览器检测集群健康,查看集群状态
192.168.187.68:9200/_cluster/health?pretty
192.168.187.48:9200/_cluster/state?pretty
192.168.187.68:9200/_cluster/state?pretty
为什么要安装这个插件?
Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要使用npm工具(NodeJS的包管理工具)安装。
安装 Elasticsearch-head 需要提前安装好依赖软件 node 和 phantomjs。node:是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
phantomjs:是一个基于 webkit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
上传软件包 node-v8.2.1.tar.gz 到/opt/ELK
yum install gcc gcc-c++ make -y 安装依赖环境cd /opt/ELK
tar zxvf node-v8.2.1.tar.gz 解包cd node-v8.2.1/
./configure 编译
make -j3 && make install 安装
phantomjs是一个基于 webkit 的 JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
#上传安装包上传到/opt目录下
cd /opt/ELK
tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src
cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/binll /usr/local/bin/
上传软件包 elasticsearch-head.tar.gz 到/opt/ELK
cd /opt
tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/ 解压到指定位置ll /usr/local/src
cd /usr/local/src/elasticsearch-head/
npm install 基于npm插件安装
vim /etc/elasticsearch/elasticsearch.yml
##末行添加以下内容
http.cors.enabled: true ##开启跨域访问支持,默认为false
http.cors.allow-origin: "*" ##指定跨域访问允许的域名地址为所有
systemctl restart elasticsearch
netstat -natp |grep 9200
cd /usr/local/src/elasticsearch-head
npm run start & 后台启动netstat -natp |grep 9100
浏览器访问:192.168.187.48:9100地址并连接群集,如果看到群集的健康值为green,代表群集很健康。
curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
#插入索引
浏览器访问 http://192.168.187.48:9100/ 查看索引信息,可以看见索引默认被分片5个,并且有一个副本。
点击“数据浏览”,会发现在node1上创建的索引为 index-demo,类型为 test 的相关信息。
上传软件包 node-v8.2.1.tar.gz 到/opt/ELK
yum install gcc gcc-c++ make -y 安装依赖环境cd /opt/ELK
tar zxvf node-v8.2.1.tar.gz 解包cd node-v8.2.1/
./configure 编译
make -j3 && make install 加快安装
phantomjs是一个基于 webkit 的 JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
#上传安装包上传到/opt目录下
cd /opt/ELK
tar -jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src
cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/binll /usr/local/bin/
上传软件包 elasticsearch-head.tar.gz 到/opt/ELK
cd /opt/ELK
tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/ 解压指定位置ll /usr/local/src
cd /usr/local/src/elasticsearch-head/
npm install
vim /etc/elasticsearch/elasticsearch.yml
##末行添加以下内容
http.cors.enabled: true ##开启跨域访问支持,默认为false
http.cors.allow-origin: "*" ##指定跨域访问允许的域名地址为所有
systemctl restart elasticsearch
netstat -natp |grep 9200
cd /usr/local/src/elasticsearch-head
npm run start & 后台启动netstat -natp | grep 9100
浏览器访问:192.168.187.68:9100地址并连接群集,如果看到群集的健康值为green,代表群集很健康。
Logstash 一般部署在需要监控其日志的服务器。在本案例中,Logstash 部署在 Apache 服务器上,用于收集 Apache 的日志信息并发送到 Elasticsearch。
yum -y install httpd
systemctl start httpd
java -version 查看版本
如果没有,安装yum -y install java
#上传压缩包到/opt/ELK目录下
cd /opt/ELK
rpm -ivh logstash-5.5.1.rpm ##安装logstash
systemctl start logstash
systemctl enable logstash
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ ##建立logstash软连接
①logstasg命令常用选项
常用选项 | 说明 |
-f | 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash的输入和输出 |
-e | 从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当做logstash的配置(如果是空,则默认使用stdin作为输入,stdout作为输出) |
-t | 测试配置文件是否正确,然后退出 |
②定义输入和输出流
logstash -e 'input {stdin{} } output { stdout{} }'
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
出现INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}后
输入 www.baidu.com
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.187.48:9200"] } }'
结果不在标准输出显示,而是发送至 Elasticsearch 中,可浏览器访问http://192.168.187.48:9100/ 查看索引信息和数据浏览。
Logstash 配置文件基本由三部分组成(根据需要选择使用)
input:表示从数据源采集数据,常见的数据源如Kafka、日志文件等
filter:表示数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式
output:表示将Logstash收集的数据经由过滤器处理之后输出到Elasticsearch。
#修改 Logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中
#配置文件中定义的是收集系统日志(system)
chmod o+r /var/log/messages
ll /var/log/messages
vim /etc/logstash/conf.d/system.conf
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.187.48:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
systemctl restart logstash.service #重启
#将安装包上传/opt/ELK目录下
rpm -ivh kibana-5.5.1-x86_64.rpm
vim /etc/kibana/kibana.yml
#--2--取消注释,Kiabana 服务的默认监听端口为5601
server.port: 5601
#--7--取消注释,设置 Kiabana 的监听地址,0.0.0.0代表所有地址
server.host: "0.0.0.0"
#--21--取消注释,设置和 Elasticsearch 建立连接的地址和端口
elasticsearch.url: "http://192.168.187.48:9200"
#--30--取消注释,设置在 elasticsearch 中添加.kibana索引
kibana.index: ".kibana"
systemctl daemon-reload
systemctl start kibana.service
systemctl enable kibana.service
netstat -antp | grep 5601
浏览器访问:http://192.168.187.48:5601
#在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.187.48:9200", "192.168.187.68:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.187.48:9200", "192.168.187.68:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
cd /etc/logstash/conf.d/
/usr/share/logstash/bin/logstash -f apache_log.conf
访问apache 192.168.187.78 增加访问日志