天天看点

JAVA进阶之路-ELK搭建以及使用

首先说下为啥要写ELK,刚进公司,因为公司以前有项目说是缺少日志系统,需要搭建一个ELK,所以就开始了我的摸坑之旅。下面进入正文。

ELK需要支持的技术有以下:

     1、Elasticsearch(以下简称为es)

            主要用于存入日志以及查询日志,为啥不用mysql存储查询呢,别问,问就是效率问题。(这个要说的太多,大家自己去慢慢查资料吧)

     2、Logstash

             用于实施的日志抓取,然后进行日志输出(有几种方法,一是输入到es里面,2就是传统的输入到数据库里面)

             Logstash详细流程:input(输入)->decode(将数据按配置解码)->filter(过滤数据)->encode(将输出数据编码)->output (输出) 

             以上流程都是通过自己配置的配置文件进行:例如

input {

                    # 从文件读取日志信息 输送到控制台

                file {

                    path => "/Users/jack/Desktop/person/elk/elasticsearch-6.1.1/logs/elasticsearch.log"

                    #codec => "json" ## 以JSON格式读取日志

                    type => "elasticsearch"

                    start_position => "beginning"

                    }

                }

                 filter {

                    mutate {  

                        split => ["message", "|"]  

                     }  

                 }

                output {

                    # 标准输出 

                    # stdout {}

                    # 输出进行格式化,采用Ruby库来解析日志   

                     stdout { codec => rubydebug }

                }

     3、kibana

           实时以图形界面显示es的数据,更方便进行日志的查询以及支持数据的复杂查询。还能将数据进行报表化.(ps:有个点要注意,kibana和es的版本问题,要注意一下,官方文档说是两个版本不能差别太大.经过自己踩的坑知道kibana的版本尽量要比es的版本高,如果是相同的话kibana启动时会报waring,虽然这东西不管也没事,看自己需求嘛。logstarsh的版本也尽量别差太多,虽然这个不知道有没有影响.)

     4、JDK

           这个就不用多说了,因为elk是需要jdk的支持所以需要安装

接下来就到了安装环节 首先安装es

使用wget 下载elasticsearch安装包

        wget  https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.2.tar.gz

    解压

        tar -zxvf elasticsearch-6.2.2.tar.gz 

       然后进入bin目录下面  elasticsearch这文件就是运行文件执行./elasticsearch就行了

     运行中你可能会遇到一些错误,比如以下的。

1、问题一

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

            #

            # There is insufficient memory for the Java Runtime Environment to continue.

            # Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.

            # An error report file with more information is saved as:

            # /usr/local/software/temp/elasticsearch-6.2.2/hs_err_pid1912.log

        解决:内存不够,购买阿里云的机器可以动态增加内存

        2、问题二

            [[email protected] bin]# ./elasticsearch

            [2018-02-22T20:14:04,870][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]

            org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root

            at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:125) ~[elasticsearch-6.2.2.jar:6.2.2]

            at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) ~[elasticsearch-6.2.2.jar:6.2.2]

            at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-6.2.2.jar:6.2.2]

            at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) ~[elasticsearch-cli-6.2.2.jar:6.2.2]

        解决:用非root用户

            添加用户:useradd -m 用户名  然后设置密码  passwd 用户名

        3、问题三

            ./elasticsearch

            Exception in thread "main" java.nio.file.AccessDeniedException: /usr/local/software/temp/elasticsearch-6.2.2/config/jvm.options

           解决:权限不够 chmod 777 -R 当前es目录

        常见配置问题资料:https://www.jianshu.com/p/c5d6ec0f35e0

        4、问题4ERROR: bootstrap checks failed

            max virtual memory areas vm.max_map_count [65530] is too low, increase to at least 

            临时设置:sudo sysctl -w vm.max_map_count=262144

            永久修改:

            修改/etc/sysctl.conf 文件,添加 “vm.max_map_count”设置

            并执行:sysctl -p

         这时我还没法进行外网访问我们必须改下配置。

           1、用vim命令打开config下面的elasticsearch.yml文件,然后进入配置,找到netword.host这个单词 将注解去掉,然后将后面的ip改成0.0.0.0,找到node.name,设置自己的节点名,最后找到cluster.initial_master_nodes这个参数,将注释去掉,将后面的数组改成你的节点名,只需要一个就行,

JAVA进阶之路-ELK搭建以及使用

类似于这样。然后wq进行保存退出,最后再运行es。

      设置外网访问后可能会启动报错,接下来你可以对照下面这个blog进行错误的排除

       https://blog.csdn.net/qq_38486203/article/details/80149185

如果成功启动后你可以在外网访问你的es,es默认的端口号是9200 如果想要修改可以在elasticsearch.yml里面的http:port修改即可。

运行成功的页面如下

JAVA进阶之路-ELK搭建以及使用

如果还是无法成功 将防火墙关闭,如果是阿里云的服务器.要在后台将安全机制加入对应的端口 比如我的es端口是9201就需要将9201加入安全机制。 以下kibana的端口也是如此 kibana的端口是5601  我下面就不再赘述了。

    这样  es就算是大功告成了。

接下来就是我们的logstash了

下载安装包

        wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.2.tar.gz

        解压:tar -zxvf logstash-6.2.2.tar.gz

    快速启动(需要java8 jre,目前不支持java9)

        ./logstash -e 'input {stdin {}} output {stdout {}}'

       logstash相比es的配置就方便多了 基本安装就可以直接运行了,如果启动报错的话可以切换root用户试下,这个如果没有设置权限的只能默认为root用户才能启动哦。

以上那个快速启动是自己手动输入 然后自动输出来,我们需要编写一个配置文件来抓取log日志文件然后进行输入到es里面

详细的我就不多说了,我们现在目标是将elk搭建起来,具体的内容大家自行去了解,接下我直接给大家贴个配置内容 根据自己的状况去自行修改。

配置三 test3_es.conf

        ========================================

          # 输入

            input {

                    file {   # 这是你要抓取的日志文件路径

                            path => "/Users/jack/Desktop/person/elk/elasticsearch-6.1.1/logs/elasticsearch.log"

                              # 这是日志的类型自己定义,方便以后日志过多无法辨认类型。

                            type => "elasticsearch"

                            start_position => "beginning" #从文件开始处读写

                    }

            }

            # 输出

            output{ 

                elasticsearch{

                    hosts=>["127.0.0.1:9201"]  # es的地址后面端口按你们配置的去改。

                    index => "es-message-%{+YYYY.MM.dd}"# 这是创建索引的名字.以时间去命名(索引是啥 你们可以具体去看es的具体教程.我们这只需要搭建起来,就先不了解了.)

                 }

               # 输出进行格式化,采用Ruby库来解析日志 

               stdout{codec => rubydebug}

            }

        ========================================

我们这就省略了filter,就不需要去过滤了。这个文件可以新建在config目录下面,启动的时候用的命令就会有所不同了 我们需要用

      ./logstash -f   配置文件路径  这样进行启动 (启动logstash时必须保证你配置文件内配置的es是启动的状态,要不然logstash是无法启动的)

验证

            查看索引列表 http://localhost:9201/_cat/indices?v  //如果是外网访问的就将localhost改成相对应的ip

            查看数据 http://localhost:9201/es-message-2018.02.26/_search

ok,es和logstash安装并且连接完成了 接下来就是 最后一步 kinaba

下载安装kibana

        wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.2-linux-x86_64.tar.gz

        解压 tar -zxvf kibana-6.2.2-linux-x86_64.tar.gz

外网访问

        开放端口,修改配置文件 confing目录下的kibana.yml

        server.host: "0.0.0.0" 

关联es

      修改配置文件 confing目录下的kibana.yml

      elasticsearch.hosts: ["http://localhost:9201"]//根据自己配置的es进行修改

     然后进入bin目录下面 输入./kibana 就能启动了 (跟logstash一样,必须确定配置的es启动才能启动成功)

     以上的启动命令都是无法退出的 一退出相对应的服务就直接关闭所以我们需要使用守护进程后台启动需要使用到

    nohup  XXX  &  例如  nohup   ./kibana    &    

这样就能让服务在后台运行了 不会因为退出而导致服务关闭。

最后说下 elk的三个服务的启动顺序 先是启动es 然后是启动logstash 最后启动kibana   kibana和logstash的启动顺序可以交换, 反正es是必须是最先启动,因为logstash和kibana的启动都需要es的支持

OK这样下来es就算是大功告成了,如果大家搭建途中遇到什么问题也欢迎大家积极留言,如果我会的话会给大家一一解答的。

bey!!

继续阅读