ELK(ElasticSearch, Logstash, Kibana)搭建微服务实时日志分析平台

原创
2018/04/28 17:15
阅读数 8.1K

        日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
        通常,日志被分散的储存不同的设备上。如果你管理数百上千台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
        开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。

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

        

        · 简单介绍一下服务的技术架构:

  • Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

  • Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。

  • Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

  • Kafka:接收用户日志的消息队列

       · ELK工作的原理图如下:

       Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。 

一、ELK 搭建系统环境准备        

 

1、软件环境

    System: CentOS 7

    ElasticSearch: 6.2.3

    Logstash: 6.2.3

    Kibana: 6.2.3

    Java: JDK8

2、ELK环境参数配置

        1、设置hostname,打开文件/etc/hostname,将内容改为elk用户关闭防火墙(如果因为其他原因不能关闭防火墙,也请不要禁止80端口):

systemctl stop firewalld.service

        2、禁止防火墙自动启动:

systemctl disable firewalld.service 

        3、打开文件/etc/security/limits.conf,添加下面四行内容:

* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

        4、打开文件/etc/sysctl.conf,添加下面一行内容:

vm.max_map_count=655360

        5、加载sysctl配置,执行命令:

sysctl –p

 

# sysctl -P 报"unknown key"错误解决办法
[root@Docker ~]# sysctl -p

	net.ipv4.ip_forward = 0

	net.ipv4.conf.default.rp_filter = 1

	net.ipv4.conf.default.accept_source_route = 0

	kernel.sysrq = 0

	kernel.core_uses_pid = 1

	net.ipv4.tcp_syncookies = 1

	error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key

	error: "net.bridge.bridge-nf-call-iptables" is an unknown key

	error: "net.bridge.bridge-nf-call-arptables" is an unknown key

	kernel.msgmnb = 65536

	kernel.msgmax = 65536

	kernel.shmmax = 2576980377

	kernel.shmall = 2097152

	kernel.shmmni = 4096

	kernel.sem = 250 32000 100 128

	fs.file-max = 6815744

	fs.aio-max-nr = 1048576

	net.ipv4.ip_local_port_range = 9000 65500

	net.core.rmem_default = 4194304

	net.core.rmem_max = 4194304

	net.core.wmem_default = 1048576

	net.core.wmem_max = 1048576

解决办法:

注:此错误可以忽视,也可以使用下面命令解决。

[root@Docker ~]# modprobe bridge
[root@Docker ~]# lsmod |grep bridge
	bridge                 48077  0

	stp                     2067  1 bridge

	llc                     5352  2 bridge,stp

	[root@oracle11gr2 Packages]# sysctl -p

	net.ipv4.ip_forward = 0

	net.ipv4.conf.default.rp_filter = 1

	net.ipv4.conf.default.accept_source_route = 0

	kernel.sysrq = 0

	kernel.core_uses_pid = 1

	net.ipv4.tcp_syncookies = 1

	net.bridge.bridge-nf-call-ip6tables = 0
	net.bridge.bridge-nf-call-iptables = 0

	net.bridge.bridge-nf-call-arptables = 0

	kernel.msgmnb = 65536

	kernel.msgmax = 65536

	kernel.shmmax = 2576980377

	kernel.shmall = 2097152

	kernel.shmmni = 4096

	kernel.sem = 250 32000 100 128

	fs.file-max = 6815744

	fs.aio-max-nr = 1048576

	net.ipv4.ip_local_port_range = 9000 65500

	net.core.rmem_default = 4194304

	net.core.rmem_max = 4194304

	net.core.wmem_default = 1048576

	net.core.wmem_max = 1048576

 

        6、重启电脑(修改完,必须重启生效,不然会有意想不到的异常)

reboot

 

二、ElasticSearch 搭建

    

        Elasticsearch是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据。它被用作全文检索、结构化搜索、分析以及这三个功能的组合。

        以下是公司使用案例:

        · Wikipedia使用Elasticsearch提供带有高亮片段的全文搜索,还有search-as-you-type和did-you-mean的建议。

        · 卫报 使用Elasticsearch将网络社交数据结合到访客日志中,实时的给它的编辑们提供公众对于新文章的反馈。

        · Stack Overflow将地理位置查询融入全文检索中去,并且使用more-like-this接口去查找相关的问题与答案。

        · GitHub使用Elasticsearch对1300亿行代码进行查询。

        然而Elasticsearch不仅仅为巨头公司服务。它也帮助了很多初创公司,像Datadog和Klout, 帮助他们将想法用原型实现,并转化为可扩展的解决方案。Elasticsearch能运行在你的笔记本电脑上,或者扩展到上百台服务器上去处理PB级数据。

        Elasticsearch中没有一个单独的组件是全新的或者是革命性的。全文搜索很久之前就已经可以做到了, 就像早就出现了的分析系统和分布式数据库。革命性的成果在于将这些单独的,有用的组件融合到一个单一的、一致的、实时的应用中。它对于初学者而言有一个较低的门槛, 而当你的技能提升或需求增加时,它也始终能满足你的需求。

        1.1 解压ElasticSearch


tar -zxvf elasticsearch-6.2.3.tar.gz

cd elasticsearch-6.2.3/

        1.2 安装Head插件(Optional):

# elasticsearch5 之前的安装方法
1.https://github.com/mobz/elasticsearch-head 下载zip 解压
2.建立${ES_HOME}\plugins\head\文件夹
3.将解压后的elasticsearch-head-master文件夹下的所有文件copy到head
4.运行es
5.打开http://localhost:9200/_plugin/head/

        因为head是一个用于管理Elasticsearch的web前端插件,该插件在ES5版本以后采用独立服务的形式进行安装使用(之前的版本可以直接在es安装目录中直接安装),因为需要安装nodejs、npm

# elasticsearch5 之后的安装方法
yum -y install nodejs npm
#如果没有安装git,还需要先安装git:

yum -y install git
#然后安装elasticsearch-head插件:

git clone https://github.com/mobz/elasticsearch-head.git
#git下载完成后,进入目录,进行操作:

cd elasticsearch-head/
npm install
#插件安装相对会慢一些,请耐心等待...

# 插件启动前,需要先对插件进行一些相关配置
# - 修改elasticsearch.yml,增加跨域的配置(需要重启es才能生效):
# 加入配置:
http.cors.enabled: true
http.cors.allow-origin: "*"

# 修改Gruntfile.js(编辑head/Gruntfile.js)文件,修改服务监听地址(增加hostname属性,将其值设置为*)
# 以下两种配置都是OK的
# 方式一:
connect: {
        hostname: '*',
        server: {
                options: {
                        port: 9100,
                        base: '.',
                        keepalive: true
                }
        }
}

# 方式二:
connect: {
        server: {
                options: {
                        hostname: '*',
                        port: 9100,
                        base: '.',
                        keepalive: true
                }
        }
}


编辑head/_site/app.js,修改head连接es的地址,将localhost修改为es的IP地址

# 原配置
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200";

# 将localhost修改为ES的IP地址
this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://IP:9200";

# 启动elasticsearch-head
cd elasticsearch-head/ && ./node_modules/grunt/bin/grunt server

# 放到后台进行运行,nohup,&,screen等各种方法操作。另外,开机启动、保持持久运行等可以
# 考虑配置rc.local、supervisord等来实现。

 

        

三、Logstash 搭建

        1、 解压Logstash

tar -zxvf logstash-6.2.3.tar.gz

        2、修改配置

        在logstash-6.2.3目录下的 config 文件夹中,新建一个配置文件 logstash.conf 

 

        

# input方式一:监听8080端口作为输入
#input {
#    beats {
#        port => "8080"
#    }
#}

# input方式二:从指定文件中作为输入信息源
input {
	file {
		codec => json
		path => "/home/redhat/ZYC_PAYMENT/PaymentWebApplication/build/*.json"		
        # 改成你项目打印的json日志文件
	}
}

# 数据过滤
filter {
	grok {
		match => { "message" => "%{TIMESTAMP_ISO08601:timestamp}\s+%{LOGLEVEL:
			severity}\s+\[%{DATA:service},%{DATA:trace},%{DATA:span},%{DATA:exportable}\]\s+%{DATA:pid}---\s+
			\[%{DATA:thread}\]\s+%{DATA:class}\s+:\s+%{GREEDYDATA:rest}" }
	}
}
# 输出配置为本机的9200端口,这是ElasticSerach服务的监听端口
output {
	elasticsearch {
		hosts => "127.0.0.1:9200"	# 改成你的 Elasticsearch 地址
	}
}

 

        在bin目录后台启动Logstash服务:

nohup ./logstash -f ../config/logstash.conf –config.reload.automatic & 

        查看启动日志:tail -f ../logs/logstash-plain.log ,日志正常输出,不报错及启动成功!

四、Kibana 搭建

        1、解压Kibana

tar -zxvf kibana-6.2.3-linux-x86_64.tar.gz

        2、修改配置与启动

        打开Kibana的配置文件 kibana-6.2.3-linux-x86_64/config/kibana.yml,找到下面这行:

#server.host: "localhost"

        改成如下内容:

server.host: "192.168.1.81"

        这样其他电脑就能用浏览器访问Kibana的服务了;

        进入Kibana的bin目录:/home/redhat/ELK/kibana-6.2.3-linux-x86_64/bin

        执行启动命令:nohup ./kibana & 

        查看启动日志:tail -f nohup.out

      3、在浏览器访问https://192.168.1.81:5601,看到如下页面

        

        至此,ELK服务启动成功。

        4、Kibana汉化


git clone https://github.com/anbai-inc/Kibana_Hanization.git
cd Kibana_Hanization/
python main.py /home/redhat/ELK/kibana-6.2.3-linux-x86_64/
systemctl restart kibana

        之后的访问效果如下:

        

 

 

展开阅读全文
打赏
0
48 收藏
分享
加载中
收集日志,kibana中显示怎么按照日志原格式换行?
2018/05/30 08:11
回复
举报
kibana的日志列表不友好呀,一个日志固定五行,有异常日志时看不到,怎么破?
2018/04/28 22:04
回复
举报
好东西
2018/04/28 19:15
回复
举报
更多评论
打赏
3 评论
48 收藏
0
分享
返回顶部
顶部