快速搭建ELK日志分析平台

日志主要包括系统日志、应用程序日志和安全日志等。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理。

开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。ELK可以将我们的系统日志、访问日志、运行日志、错误日志等进行统一收集、存储分析和搜索以及图形展现。

  • Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
  • Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
  • Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

官方网站:https://www.elastic.co

1. Elasticsearch

Elasticsearch需要至少Java 8。Java的安装在不同的平台下是不一样,这里提供Linux安装JAVA的方法。

安装java环境

1.在Oracle官方下载新版jdk,下载地址:

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-

2133151.html

2.建议下载安装.rpm格式后缀的JDK,不需要配置java环境变量,会自动配置,上传安装包至服务器安装jdk。

# rpm -ivh jdk-8u171-linux-x64.rpm

3.检查JAVA是否安装成功,显示如下结果,说明安装成功。

# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

一旦Java准备就绪,然后我们就可以下载并安装运行Elasticsearch。我们可以从这个页面http://www.elastic.co/downloads/elasticsearch获取所有发行版本的二进制安装包。每一个版本都对应有zip和tar压缩包,还有deb和rpm安装包,还有Windows下用的msi安装包。

安装elasticsearch

1.将下载好的rpm安装包上传至Linux服务器上,执行命令安装。

# rpm --install elasticsearch-6.4.0.rpm

如果你的linux服务器可以上网,也可以用yum进行安装。

# cat /etc/yum.repos.d/elasticsearch.repo #编辑最新的elasticsearch.repo文件
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# yum install elasticsearch -y #yum安装elasticsearch

2.使用命令可查看elasticsearch安装位置。

# rpm -ql elasticsearch

3.运行elasticsearch。

# systemctl start elasticsearch

4.如果一切正常,Elasticsearch就会在默认的9200端口运行。这时请求9200端口,Elastic 返回一个 JSON 对象,包含当前节点、集群、版本等信息。

# curl localhost:9200
{
 "name" : "U895YAk",
 "cluster_name" : "elasticsearch",
 "cluster_uuid" : "m6sBcukAS422XA5cgrwRqA",
 "version" : {
 "number" : "6.4.0",
 "build_flavor" : "default",
 "build_type" : "rpm",
 "build_hash" : "595516e",
 "build_date" : "2018-08-17T23:18:47.308994Z",
 "build_snapshot" : false,
 "lucene_version" : "7.4.0",
 "minimum_wire_compatibility_version" : "5.6.0",
 "minimum_index_compatibility_version" : "5.0.0"
 },
 "tagline" : "You Know, for Search"
}

配置Elasticsearch

Elasticsearch配置文件是在/etc/elasticsearch下的elasticsearch.yml文件。在编辑之前先停止elasticsearch。

# systemctl stop elasticsearch

主要配置说明,我们grep一下需要做的配置。

# grep '^[a-z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: idc-elk #设置集群名称
node.name: idc-elk-node1 #设置节点名称
path.data: /var/lib/elasticsearch #默认索引存储位置
path.logs: /var/log/elasticsearch #默认日志存储位置
bootstrap.memory_lock: true #锁定进程物理内存,避免(swapped)来提高性能 
network.host: 0.0.0.0 #设置网络允许任意访问
http.port: 9200 #打开默认监听端口

默认情况下,Elasticsearch只允许本机访问,如果需要远程访问,需修改 Elasticsearch的 elasticsearch.yml配置文件,去掉network.host的注释,将它的值改成0.0.0.0,还需关闭系统防火墙或者放行9200运行端口。

关闭Linux防火墙,并设置开机不启动。

# systemctl stop firewalld
# systemctl disable firewalld

启动elasticsearch,并设置开机启动。

# systemctl start elasticsearch
# systemctl enable elasticsearch

这时我们可以通过浏览器访问输入http://IP:9200访问elasticsearch。

ElasticSearch-Head插件安装

ElasticSearch-Head 是一个与Elasticsearch集群(Cluster)相交互的Web前台。

ElasticSearch-Head的主要作用:

  • 它展现ES集群的拓扑结构,并且可以通过它来进行索引(Index)和节点(Node)级别的操作。
  • 它提供一组针对集群的查询API,并将结果以json和表格形式返回。
  • 它提供一些快捷菜单,用以展现集群的各种状态。

ElasticSearch-Head github地址:https://github.com/mobz/elasticsearch-head

1.下载ElasticSearch-Head源码。

# git clone git://github.com/mobz/elasticsearch-head.git

2.安装ElasticSearch-Head。

# cd /usr/share/elasticsearch/elasticsearch-head
# npm install

3.配置插件,插件启动前需要先对插件进行一些相关配置。

1修改elasticsearch.yml,增加跨域的配置(需要重启es才能生效)。启用CORS,允许访问的IP地址段,* 为所有IP都可以。

# echo "http.cors.enabled: true" >>/etc/elasticsearch/elasticsearch.yml
# echo "http.cors.allow-origin: \"*\"" >>/etc/elasticsearch/elasticsearch.yml
# tail -2 /etc/elasticsearch/elasticsearch.yml 
http.cors.enabled: true
http.cors.allow-origin: "*"

2编辑Gruntfile.js,修改服务器监听地址,增加hostname属性将其值设置为*。

# cat /usr/share/elasticsearch/elasticsearch-head/Gruntfile.js | grep "hostname" 
-C 5
 },
 
 connect: {
 server: {
 options: {
 hostname: '*',
 port: 9100,
 base: '.',
 keepalive: true
 }
 }

3编辑 _site/app.js,修改head连接es的地址。

# sed -i 's#http://localhost:9200#http://172.28.29.211:9200#g' 
/usr/share/elasticsearch/elasticsearch-head/_site/app.js
# cat /usr/share/elasticsearch/elasticsearch-head/_site/app.js | grep “172.28.29.211”
 this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://172.28.29.211:9200";

4.后台方式启动ElasticSearch-Head插件。

# cd /usr/share/elasticsearch/elasticsearch-head/node_modules/grunt/bin
# nohup ./grunt server & exit

5. 启动成功后,可在浏览器输入http://IP:9100访问head插件并与ES进行交互。

Elasticsearch集群配置

Elasticsearch多机集群中的节点可以分为master nodes和data nodes,在配置文件中使用Zen发现(Zen discovery)机制来管理不同节点。

Elasticsearch集群中有的节点一般有三种角色:master node、data node和client node。

  1. master node:master节点主要用于元数据(metadata)的处理,比如索引的新增、删除、分片分配等。
  2. data node:data节点上保存了数据分片。它负责数据相关操作,比如分片的 CRUD,以及搜索和整合操作。这些操作都比较消耗 CPU、内存和 I/O 资源。
  3. client node:client 节点起到路由请求的作用,实际上可以看做负载均衡器。( 对于没有很多请求的业务,client node可以不加,master和data足矣)。

1.将idc-elk-node1(172.28.29.211)设为master节点配置。

# sed -n '69,73'p /etc/elasticsearch/elasticsearch.yml
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["172.28.29.211", "172.28.29.212"]
#

2. idc-elk-node2(172.28.29.212)节点配置。

# sed -n '69,73'p /etc/elasticsearch/elasticsearch.yml 
#discovery.zen.ping.unicast.hosts: ["host1", "host2"]
node.master: false #表示该节点不会作为主节点
node.data: true #表示该节点可以存储数据,false表示只作为搜索
discovery.zen.ping.unicast.hosts: ["172.28.29.211", "172.28.29.212"] #有多少节点配置多少IP
#

3.重启elasticsearch,登录head插件查看集群状态,可以看到两台node,idc-elk-node1为master。

2. Logstash

Logstash 是一个开源的数据收集引擎,它具有备实时数据传输能力。它可以统一过滤来自不同源的数据,并按照开发者的制定的规范输出到目的地。顾名思义,Logstash 收集数据对象就是日志文件。由于日志文件来源多(如:系统日志、服务器日志、网络设备日志等),且内容杂乱,不便于人类进行观察。因此,我们可以使用 Logstash 对日志文件进行收集和统一过滤,变成可读性高的内容,方便开发者或运维人员观察,从而有效的分析系统/项目运行的性能,做好监控和预警的准备工作等。

Logstash 通过管道进行运作,管道有两个必需的元素,输入和输出,还有一个可选的元素,过滤器。输入插件从数据源获取数据,过滤器插件根据用户指定的数据格式修改数据,输出插件则将数据写入到目的地。在实际工作中Logstash数据收集的一个流程大概是:数据源→通过input插件(如file、redis、stdin)→output插件→写到Elasticsearch。

Logstash安装同样依赖JAVA,之前已经安装不做介绍。Logstash官网下载地址:https://www.elastic.co/downloads/logstash。

安装logstash只需将下载好的tar包上传到服务器上,解压在相应目录即可,例如/usr/local下:

# tar -xzvf logstash-6.4.0.tar.gz -C /usr/local

如果你的linux服务器可以上网,也可以用yum进行安装。

# cat /etc/yum.repos.d/logstash.repo #编辑一个最新的logstash.repo文件
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# yum install logstash -y #yum安装logstash

运行Logstash

在logstash安装目录下执行如下命令进行启动测试。

# /usr/local/logstash-6.4.0/bin/logstash -e 'input{stdin{}} output{stdout{}}'
Sending Logstash logs to /usr/local/logstash-6.4.0/logs which is now configured via log4j2.properties
[2018-08-29T10:03:48,479][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
hello test2018 #手动输入字符串作为标准输入,按回车
{
 "@version" => "1", #版本号
 "host" => " idc-elk-node2 ", #数据由哪个节点发过来
 "@timestamp" => 2018-08-29T14:04:50.047Z, #自动生成时间戳
 "message" => "hello test2018" #输入的内容
}

我们可以看到,我们输入什么内容logstash按照某种格式输出,其中-e参数允许Logstash直接通过命令行接受设置。这点尤其快速的帮助我们反复的测试配置是否正确而不用写配置文件。使用CTRL-C命令可以退出之前运行的Logstash。

Logstash使用-e参数在命令行中指定配置是很常用的方式,不过如果需要配置更多设置则需要很长的内容。这种情况,我们首先创建一个简单的配置文件,并且指定logstash使用这个配置文件。

配置文件写法:

# 日志导入
input {
}
# 日志筛选匹配处理
filter {
}
# 日志匹配输出
output {
}

配置文件运行测试

1.在logstash安装目录下创建一个测试文件logstash-test.conf,文件内容如下:

# cat logstash-test.conf 
input{
 stdin{}
}
output{
 stdout{codec=>rubydebug}
}

Logstash使用input和output定义收集日志时的输入和输出的相关配置,本例中input定义了一个叫"stdin"的input,output定义一个叫"stdout"的output。无论我们输入什么字符,Logstash都会按照某种格式来返回我们输入的字符,其中output被定义为"stdout"并使用了codec参数(一种解码编码的工具)来指定logstash输出格式。

2. 使用logstash的-f参数来读取配置文件,执行如下开始进行测试:

# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-test.conf
 [INFO ] 2018-08-29 10:47:42.561 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
hello test 2018! #同理输入字符串按一定格式输出显示
{
 "@timestamp" => 2018-08-29T14:48:19.048Z,
 "@version" => "1",
 "host" => " idc-elk-node2 ",
 "message" => "hello test 2018!"
}

配置文件写入Elasticsearch

我们创建一个测试文件logstash-es.conf,将logstash收集到的数据提交到elastisearch中,这里需要使用一个output插件——elasticsearch。

# cat logstash-es.conf 
input { 
 stdin {}
 }
output {
 elasticsearch {
 hosts => ["172.28.29.211:9200"]
 }
}

启动logstash进行测试:

# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-es.conf 
 [INFO ] 2018-08-29 11:14:02.644 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600}
ni shi wo de xiaopingguo #随便输入一些内容
nnnn
zenme ai ni doubuduo!

登录到Elasticsearch就可以查看到数据了。

3.Kibana

Kibana官网下载地址:https://www.elastic.co/downloads/kibana。

安装Kibana只需将下载好的tar包上传到服务器上,解压在相应目录即可,例如/usr/local下:

# tar -xzvf kibana-6.4.0-linux-x86_64.tar.gz -C /usr/local

如果你的linux服务器可以上网,也可以用yum进行安装。

# cat /etc/yum.repos.d/kibana.repo #编辑一个最新的kibana.repo文件
[kibana-6.x]
name=Kibana repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# yum install kibana -y #yum安装kibana

配置Kibana

如果是用rpm安装kibana配置文件是在/etc/kibana下的kibana.yml文件。

主要配置说明:

# grep '^[a-z]' /etc/kibana/kibana.yml 
server.port: 5601 #打开默认端口
server.host: 0.0.0.0 #设置网络允许任意访问
elasticsearch.url: http://172.28.29.211:9200 #配置elasticsearch地址
kibana.index: ".kibana" #默认kibana创建的索引

运行Kibana

运行Kibana并设置开机启动。

# systemctl start kibana
# systemctl enable kibana

打开浏览器输入http://IP:5601就可以访问Kibana了。

至此,ELK日志分析平台搭建完成。

举报
评论 0