什么是ELK STACK

ELK StackElasticserachLogstashKibana三种工具组合而成的一个日志解决方案。ELK可以将我们的系统日志、访问日志、运行日志、错误日志等进行统一收集、存储分析和搜索以及图形展现。相比传统的CTRL+F或者数据库语句来进行数据查询,ELK支持分布式搜搜,数据量可达PB级别,检索速度更快速,接近实时处理,并且更智能,可以去掉一些没有特殊含义的词汇,比如“这,的,是”,还可以进行搜索补全与搜索纠错。

LogStash

负责日志的收集,并且可以输出到指定位置,如Redis、kafka、以及最主要的ElasticSearch中,通常会在所有需要收集日志的服务器上安装Logstash,然后由Logstash agent端发送到Logstash的Server端

ElasticSearch

使用JAVA开发、基于Lucene搜索引擎库的全文搜索工具,通过RESTful API(一种接口设计规范,让接口更易懂)隐藏了Lucene原本的复杂性。实现了日志数据的分布式、实时分析,并且可以进行搜索补全与纠错等功能,是ELK最核心的组件。相比MySQL库和表的概念,在ES中把库叫做索引。

Kibana

负责数据的展示与统计,是一个图形化的管理系统。

下面一一介绍这几个系统的安装搭建。

一、安装Elasticsearch:

1、ElasticSearch默认工作在集群模式下,扩展性很强,并且支持自动发现。所以在实验环境中需要至少2台服务器来搭建,但是为了防止脑裂,建立使用基数台服务器。在部署ElasticSearch前需要先部署JAVA环境,所以第一步是安装JDK,这里偷懒使用yum安装了openjdk,生产环境还是建议用JDK的源码包(暂时不支持JDK 9)。

1 yum install java-1.8.0-openjdk.x86_64

2、下载ElasticSearch,官网地址是www.elastic.co(不是com),其每个Products下都有专门的文档用于参考。

下载tar包解压,然后进入config目录,该目录下除了有一个主配置文件elasticsearch.yml需要配置外,还有一个jvm.options文件用于JVM的调优

1 tar zxf elasticsearch-6.3.tar.gz
2
3 cd elasticsearch-6.3/config

jvm.options文件主要是JVM优化相关,关于垃圾回收这块使用默认配置就可以了,我们要调整的就是最大内存和最小内存的设置。通常设置为一样大小,具体的值可以设置为系统最大内存的一半或三分之二

1 -Xms1g  #程序启动时占用内存的大小
2
3 -Xmx1g  #程序启动后最大可占用内存的大小

3、修改ElasticSearch的配置,编辑elasticsearch.yml

 1 cluster.name: my-application  #集群名称,相同集群名称的节点会自动加入到该集群
 2
 3 node.name: r1  #节点名称,两个节点不能重复
 4
 5 path.data: /path/to/data  #指定数据存储目录
 6
 7 path.logs: /path/to/logs  #指定日志存储目录
 8
 9 network.host: 0.0.0.0  #本机地址或者4个0
10
11 http.port: 9200  #指定端口
12
13 discovery.zen.ping.unicast.hosts: ["192.168.44.130"]  #集群中master节点初始化列表,通过列表中的机器来自动发现其他节点

3、运行bin/elasticsearch 启动服务(加-d是在后台运行)。启动后服务会监听在9200端口,还有个9300端口用于集群间通信。如果配置文件中监听的端口是外网地址,在运行Elasticsearch时会遇到一些内核报错,具体报错和解决方法如下(做好配置后,需要注销用户重新登录才会生效):

(1)don't run elasticsearch as root:

解决办法:Elasticsearch是不允许使用root用户来运行的,所以需要把ElasticSearch目录所有者修改为其他用户,并切换到该用户去执行。用浏览器打开能看到如下信息代表安装成功:

(2)Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12):

解决办法:内存不足,升级内存

(3)Exception in thread "main" java.nio.file.AccessDeniedException

解决办法:运行Elasticsearch程序的用户权限不够,把Elasticsearch目录权限修改下即可

(4)max virtual memory areas vm.max_map_count [65530] is too low
解决办法:修改/etc/sysctl.conf,增加一行vm.max_map_count= 262144。然后执行sysctl -p使其生效

(5)max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
解决办法:修改/etc/security/limits.conf,做以下配置

1 *                soft   nproc          65536
2 *                hard   nproc          65536
3 *                soft   nofile         65536
4 *                hard   nofile         65536

(6)max number of threads [3812] for user [elkuser] is too low, increase to at least [4096]

解决办法:修改/etc/security/limits.d/20-nproc.conf,做以下配置

1 *          soft    nproc     4096
2 *          hard    nproc     4096

Elasticsearch接口说明:

ES启动后如何验证节点是否在集群中呢?ES是使用RESTful形式的接口对外提供访问,所以我们要访问ES接口的话可以使用curl命令。ES有四类API,作用大概如下:

1、用来检查集群节点、索引当前状态

2、管理集群节点、索引及元数据

3、执行增删改查操作

4、执行高级操作,例如paging,filtering

Elasticsearch 常用API有cat、cluster等,下面是一些简单介绍:

通过curl可以看到cat这个API下有很多子功能

1、Elasticsearch集群健康检查:

通过cat、cluster两个API都可以进行集群健康检查,green代表集群完全正常;yellow代表集群正常,部分副本分片不正常;red代表集群故障,数据可能会丢失

1 http://localhost:9200/_cat/health
2
3 http://localhost:9200/_cat/health?v  #显示信息更详尽
4
5 http://localhost:9200/_cluster/health
6
7 http://localhost:9200/_cluster/health?pretty(加上pretty会将内容格式化再输出,更美观)

2、查询所有节点列表

1 http://localhost:9200/_cat/nodes?v

3、查询所有索引

1 http://localhost:9200/_cat/indices?v

curl命令在Elasticsearch中的使用

使用curl可以通过模拟http请求的方式去创建和管理索引,常用选项如下:

-X:指定http的请求方法,如HEAD,POST,PUT,DELETE

-d:指定要传输的数据

-H:指定http请求头信息

1、使用curl新增索引

1 curl -XPUT "localhost:9200/blog_test?pretty"  #新增一个blog_test索引

2、删除索引

1 curl -X DELETE "localhost:9200/bolg_test?pretty"

3、查询创建的索引

1 http://localhost:9200/_cat/indices?v

下面是更贴近实际操作的curl命令,插入了两条数据

 1 #为blog索引新增两条记录,指定type为article,ID为2和3
 2
 3 curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/2?pretty' -d '
 4
 5 {
 6
 7   "title": "test",
 8
 9   "content":"testsfsdfdsfdsf",
10
11   "PV":10
12
13 }'
14
15
16
17 curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/3?pretty' -d '
18
19 {
20
21   "title": "test",
22
23   "content":"testsfsdfdsfdsf",
24
25   "PV":23
26
27 }'

查询索引和数据搜索

1 #通过ID来查询
2
3 curl -XGET 'localhost:9200/blog/article/2?pretty'
4
5 #指定具体的索引和type进行搜索
6
7 curl -XGET 'http://localhost:9200/blog/article/_search?q=title:test'

二、Logstash安装步骤

1、下载Logstash 6.3

依然是在ELK的官方网站www.elastic.co,本文以源码包形式进行Logstash的安装。其实Logstash的安装很简单,只要保证JDK正常运行(目前只支持JDK8),然后直接解压Logstash即可。这里我们解压到了/usr/local/logstash下,并且建立一个软连接

1 tar zxf logstash-6.3.tar.gz
2
3 mv logstash-6.3 /usr/local/
4
5 ln -s logstash-6.3.logstash

2、配置与命令行启动Logstash

在Logstash目录下有很多子目录,但是大多数是不用去关注和修改的(仅有2个配置文件可能需要略微修改,一个是config/logstash.yml,可能需要修改启动进程数以及日志信息;一个是jvm.options,这个和Elasticsearch是一样的,主要是优化内存)。bin目录下有启动服务需要的脚本,现在可以用命令行来启动Logstash测试是否正常(运行后多等一会儿才有反应):

 1 cd logstash-6.3
 2
 3 bin/logstash -e 'input{ stdin{} } output{ stdout{} }'  #-e选项是直接用命令行模式,采用标准输入,标准输出
 4
 5 Settings: Default pipeline workers: 1
 6
 7 Pipeline main started
 8
 9 hello world  #这里手动输入的hello world,作为标准输入
10
11 2016-05-19T01:59:03.797Z 0.0.0.0 hello world  #标准输出的结果显示在屏幕
12
13 nihao
14
15 2016-05-19T02:00:20.013Z 0.0.0.0 nihao

使用codec指定输出格式(codec是一种解码编码的工具)

 1 [root@server bin]# ./logstash -e 'input{ stdin{} } output{ stdout{codec => rubydebug} }'  # -e选项是直接用命令行模式,输入采用标准输入,输出采用的codec风格
 2
 3 Settings: Default pipeline workers: 1
 4
 5 Pipeline main started
 6
 7 hello world
 8
 9 {
10
11        "message" => "hello world",  #输入的内容
12
13        "@version" => "1",  #版本号
14
15        "@timestamp" => "2016-05-19T02:09:43.921Z",  #自动生成时间戳
16
17        "host" => "0.0.0.0"  #数据是由哪个节点发过来的

3、自定义Logstash配置文件

生产环境中需要用到的规则更为复杂,使用命令行显然不可取。所以可以自定义规则文件,然后让Logstash根据规则进行工作。下面是通过配置文件指定Logstash的数据输入输出的示例,配置文件里主要是写明input、output规则,filter规则是需要过滤内容时才会有:

 1 input{
 2
 3 stdin {}
 4
 5 }
 6
 7
 8
 9 output{
10
11         stdout{
12
13                 codec  => rubydebug
14
15         }
16
17 }

启动服务时加上-t选项可以检查配置文件是否正确,-f选项就是配置文件的路径

1 logstash -t  -f /etc/logstash.conf

启动成功后会看到Pipeline main started这样的信息出来,这个时候我们就可以输入信息给Logstash了,我们输入的信息会通过标准输出显示到屏幕上,如图:

在Logstash中输入的数据我们可以通过日志文件来获取,当然输出的数据我们也可以指定到自己需要的容器中,如Elasticsearch里。要通过日志文件来获取输入信息的话就需要用到最常用的input插件——file(官方文档里有详细介绍每个input插件的使用方式,output插件同理)。下面是一个使用file插件的简单案例,由于output依然是标准输出,所以会有疯狂刷屏的情况出现:

 1 vi etc/logstash.conf
 2
 3 input {
 4
 5   file {
 6
 7     path => [ "/var/log/secure" ]  #文件路径
 8
 9     type => "system"  #类似打个标记,自定义
10
11     start_position => "beginning"  #从文件头部读取,相反还有end
12
13   }
14
15 }
16
17
18 output {
19
20   stdout {
21
22     codec => rubydebug
23
24   }
25
26 }

file插件使用了一个sincedb文件来记录当前文件读区位置,即使重新启动服务也不会丢失文件的读取位置。默认情况下sincedb文件放在运行Logstash的用户的主目录中,可以用sincedb_path选项自定义存放路径。

总结:在实际工作中Logstash数据收集的一个流程大概是:数据源→通过input插件(如file、redis、stdin)→output插件→写到Elasticsearch。在官网文档中可以看到有很多其他input插件,如图:

下面看看如何将Logstash收集到的数据提交给Elasticsearch。这里需要使用一个output插件——elasticsearch。使用方法也很简单,只需要在配置文件里指定插件就可以了,如下:

 1 [root@server ~]# cat /etc/logstash.conf
 2
 3 input{
 4
 5   file{
 6
 7     path=> "/var/log/audit/audit.log"
 8
 9     type=> "system"
10
11     start_position=> "beginning"
12
13   }
14
15 }
16
17 output{
18
19   elasticsearch{  #输出到es
20
21     hosts=> ["192.168.44.129:9200","192.168.44.130:9200"]
22
23   }
24
25 }

文件设置好了后运行logstash的程序,再到Elasticsearch就可以查看到数据了

1 [root@server ~]# /usr/local/logstash/bin/logstash -f /etc/logstash.conf

在生产环境中启动Logstash都是放后台运行,我们可以一次运行多个程序,因为Logstash不会占用端口,加-w选项可以启动多个线程,提高效率,默认是2,例:

1 nohup /logstash/bin/logstash agent -f /logstash/conf/indexer-xire.conf -w 4 &

三、Kibana安装步骤

继Elasticsearch和Logstash之后,轮到了Kibana。Kibana是为Elasticsearch提供的可视化平台,负责数据的美观展示。Kibana的安装和Logstash一样极其简单,而且不需要在每个客户端都安装,通常想让哪台服务器作为展示就用哪台安装一个kibana,Kibana是从Elasticsearch中获取数据的,即使安装在Elasticsearch集群之外的节点也是没有问题的。

1 tar zxf kibana-6.3-linux-x64.tar.gz
2
3 mv kibana-6.3-linux-x64 /usr/local/
4
5 ln -s /usr/local/kibana-6.3-linux-x64 /usr/local/kibana

配置很简单,修改配置文件config/kibana.yml里的以下信息即可:

1 vi config/kibana.yml
2
3  server.port: 5601  #服务端口
4
5  server.host: "0.0.0.0"  #修改为本机地址
6
7  elasticsearch.url: "http://192.168.44.129:9200"  #ES的地址与端口
8
9  kibana.index: ".kibana"

运行bin/kibana可以直接启动服务,但是通常是放后台运行,所以加上nohup吧(从2.x到6.x都是这个方式)

1 nohup kibana &

Kibana服务默认监控在5601端口,浏览器访问http://IP:5601可以打开Kibana的界面(不要用IE内核访问)。第一次访问Kibana会提示配置索引,输入在ES中存在的索引名字后Kibana会自动进行正则匹配(通常用Logstash发送的数据索引名是以logstash打头,用filebeat就是filebeat打头,当然也可以在Logstash配置文件的output段使用index选项自定义索引)

 1 output {
 2
 3   elasticsearh {
 4
 5     hosts => ["http://127.0.0.1:9200"]
 6
 7     index => "nginx-%{+YYYY.MM.dd}"
 8
 9   }
10
11 }

左侧导航栏有很多选项,Discover用于和Elasticsearch交互和展示搜索结果;Visualize用于报表生成,比如有一个银行系统,里面有很多用户,现在想统计每个存钱区间的人数,存款在1万以下有多少人,5万以下有多少人等,用这个报表系统就可以方便的进行操作。

右上角有个时间过滤器,默认是logstash索引最后15分钟的数据,没有的话就会显示No results found。点击过滤器后可以在左侧选择过滤条件,分为了快速查找(Quick)、相对时间(Relative)、绝对时间(Absolute)。

在中间部分有绿色的直方图,点击绿色区域会跳转到对应时间的数据,并且显示该时间内产生了多少数据,如图:

在页面左侧可以选择索引以及字段:

通过kibana进行全文搜索也很简单,只需要在搜索框里输入关键词,然后就会自动把匹配的日志给展示出来:

Kibana的监控页

和Nginx一样,Kibana也有一个监控页用于查看服务器当前状况,当然在生产中最好也使用Nginx做好权限审核,不要让任何人都可以登录,Kibana监控页访问地址是http://URL/status!

至此一个高效多功能的日志系统就初步完成了。

转载于:https://www.cnblogs.com/yswenli/p/9708140.html

快速搭建日志系统——ELK STACK相关推荐

  1. 创业公司 互联网架构方案 整体技术栈 基础设施 数据库 服务治理 消息中间件 日志系统 ELK 自动化部署

    欢迎关注博主公众号:[矿洞程序员]文章由陈晓阳原创. 本人微信:chenxiaoyangzxy. 免费提供本人大量学习资料. 从零开始搭建创业公司后台技术栈 原创: 潘锦 说到后台技术栈,脑海中是不是 ...

  2. Docker-Compose快速搭建Oracle-11G系统

    Docker-Compose快速搭建Oracle-11G系统 前置条件 请先安装Docker 脚本 version: '2' services:oracle11g:image: filemon/ora ...

  3. Docker-Compose快速搭建Oracle-12C系统

    Docker-Compose快速搭建Oracle-12C系统 前置条件 请先安装Docker 脚本 version: '2' services:oracle12c:image: sath89/orac ...

  4. 快速搭建论坛系统看这里,社交系统ThinkSNS助你快人一步!!!

    2019独角兽企业重金招聘Python工程师标准>>> 什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研 ...

  5. 如何轻松快速搭建商城系统?

    现如今,市场上的商城系统的种类实在是太多了,真是玲琅满目,但是真正算得上杰作的并不多,我们得找合适自己的商城系统,ShopSDK能轻松快速搭建商城系统.2小时快速集成商城系统,商品管理 - 订单交易 ...

  6. 如何快速搭建App系统-工具广告变现篇

    如何快速搭建App系统-工具广告变现篇 工具App简述说明 最简工具App的组成 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与 ...

  7. 利用Disqus快速搭建评论系统

    说实在的真正的代码就那么几行,为了凑字数,先抄一段百度百科上的简介,有兴趣的童鞋可以去Disqus官网上看一看 Disqus的主要目标是通过提供功能强大的第三评论系统,将当前不同网站的相对孤立.隔绝的 ...

  8. 【产品环境】使用ELK搭建日志系统

    为什么80%的码农都做不了架构师?>>>    随着业务不断完善与发展,日志的重要性稳步上升.我们需要从日志中排查错误,以及分析用户行为,为业务发展提供参考意见.因此,需要一套专门的 ...

  9. 使用XLog、Spring-Boot、And-Design-Pro搭建日志系统

    一.前言:移动端为什么要三方日志系统 日志系统用于记录用户行为和数据以及崩溃时的线程调用栈,以帮助程序员解决问题,优化用户体验. iOS系统就有自带Crash收集应用程序"ReportCra ...

最新文章

  1. 【408预推免复习】计算机组成原理之存储器
  2. Codeforces 809A - Do you want a date?(数学+排序)
  3. 【算法】一个简单的随机森林(RF)原理
  4. vue基础知识(一)
  5. json-server的使用
  6. 谷歌排名第一的编程语言,收下这份资料,小白也能学的会!
  7. c语言 link找不到函数,link失败,找不到库函数'sqrtf',math.h的头文件已经包含...
  8. linux文件系统管理实践题目,Linux软件管理、文件系统管理实践
  9. Filter过滤器的生命周期
  10. windows之无法选择默认打开方式
  11. 使用串口打印系统时间
  12. python源码剖析_Python源码剖析 深度探索动态语言核心技术
  13. Python AutoCAD 选择集
  14. 给腾讯云主机上配置SFTP
  15. 【论文阅读】 Object Detection in 20 Years: A Survey
  16. 怎么把中文用户名改成英文?
  17. android --拍照相册选取图片[兼容小米等其他手机]
  18. PS打不开php,ps打不开未响应怎么办
  19. vivado下MT25qu02g Flash 固化
  20. coreldraw凸起字符_CorelDRAW X7制作凹凸字效果

热门文章

  1. ESP32设备驱动-SHT30温度湿度传感器驱动
  2. som神经网络聚类简单例子_深度聚类的可视化解释
  3. Vue3使用富文本框(wangeditor)
  4. linux开启redis端口的防火墙
  5. @requestParam与@Param区别
  6. cas66-71-7|1,10-菲啰啉有机配体/ 1,10-Phen/邻菲啰啉/邻二氮杂菲
  7. 翻译:seq2seq model in Machine Learning
  8. select2回显操作
  9. Metis异常检测算法源码概要
  10. html 苹果app安装app,未越狱的苹果手机如何安装非App Store的应用?