精华内容
下载资源
问答
  • ELK 实时日志分析平台 安装部署手册 PAGE II 目 录 TOC \o "1-3" \h \z \u 第1章 服务器环境部署 1 第一节 系统环境需求 1 第二节 环境配置 2 1.2.1 建立es用户 2 1.2.2 环境配置 2 第三节 安装配置 3 1.3.1 JAVA...
  • ELK实时日志分析平台环境部署–完整记录 https://www.cnblogs.com/kevingrace/p/5919021.html 在日常运维工作中,对于系统和业务日志的处理尤为重要。今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析...

    ELK实时日志分析平台环境部署–完整记录

    https://www.cnblogs.com/kevingrace/p/5919021.html

    在日常运维工作中,对于系统和业务日志的处理尤为重要。今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~

    概念介绍
    日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

    通常,日志被分散在储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。

    集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

    通过我们需要对日志进行集中化管理,将所有机器上的日志信息收集、汇总到一起。完整的日志数据具有非常重要的作用:
    1)信息查找。通过检索日志信息,定位相应的bug,找出解决方案。
    2)服务诊断。通过对日志信息进行统计、分析,了解服务器的负荷和服务运行状态,找出耗时请求进行优化等等。
    3)数据分析。如果是格式化的log,可以做进一步的数据分析,统计、聚合出有意义的信息,比如根据请求中的商品id,找出TOP10用户感兴趣商品。

    开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成:
    1)ElasticSearch是一个基于Lucene的开源分布式搜索服务器。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
    在elasticsearch中,所有节点的数据是均等的。
    2)Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤、分析,支持大量的数据获取方法,并将其存储供以后使用(如搜索)。说到搜索,logstash带有一个web界面,搜索和展示所有日志。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
    3)Kibana 是一个基于浏览器页面的Elasticsearch前端展示工具,也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

    为什么要用到ELK?
    一般我们需要进行日志分析场景是:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
    一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

    一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
    一个完整的集中式日志系统,需要包含以下几个主要特点:
    1)收集-能够采集多种来源的日志数据
    2)传输-能够稳定的把日志数据传输到中央系统
    3)存储-如何存储日志数据
    4)分析-可以支持 UI 分析
    5)警告-能够提供错误报告,监控机制

    ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。

    ELK工作原理展示图:

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

    Logstash工作原理:
    Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。

    Input:输入数据到logstash。

    一些常用的输入为:
    file:从文件系统的文件中读取,类似于tial -f命令
    syslog:在514端口上监听系统日志消息,并根据RFC3164标准进行解析
    redis:从redis service中读取
    beats:从filebeat中读取
    Filters:数据中间处理,对数据进行操作。

    一些常用的过滤器为:
    grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。
    mutate:对字段进行转换。例如对字段进行删除、替换、修改、重命名等。
    drop:丢弃一部分events不进行处理。
    clone:拷贝 event,这个过程中也可以添加或移除字段。
    geoip:添加地理信息(为前台kibana图形化展示使用)
    Outputs:outputs是logstash处理管道的最末端组件。一个event可以在处理过程中经过多重输出,但是一旦所有的outputs都执行结束,这个event也就完成生命周期。

    一些常见的outputs为:
    elasticsearch:可以高效的保存数据,并且能够方便和简单的进行查询。
    file:将event数据保存到文件中。
    graphite:将event数据发送到图形化组件中,一个很流行的开源存储图形化展示的组件。
    Codecs:codecs 是基于数据流的过滤器,它可以作为input,output的一部分配置。Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。

    一些常见的codecs:
    json:使用json格式对数据进行编码/解码。
    multiline:将汇多个事件中数据汇总为一个单一的行。比如:java异常信息和堆栈信息。

    ELK整体方案=
    ELK中的三个系统分别扮演不同的角色,组成了一个整体的解决方案。Logstash是一个ETL工具,负责从每台机器抓取日志数据,对数据进行格式转换和处理后,输出到Elasticsearch中存储。Elasticsearch是一个分布式搜索引擎和分析引擎,用于数据存储,可提供实时的数据查询。Kibana是一个数据可视化服务,根据用户的操作从Elasticsearch中查询数据,形成相应的分析结果,以图表的形式展现给用户。
    ELK的安装很简单,可以按照"下载->修改配置文件->启动"方法分别部署三个系统,也可以使用docker来快速部署。具体的安装方法这里不详细介绍,下面来看一个常见的部署方案,如下图所示,部署思路是:
    1)在每台生成日志文件的机器上,部署Logstash,作为Shipper的角色,负责从日志文件中提取数据,但是不做任何处理,直接将数据输出到Redis队列(list)中;
    2)需要一台机器部署Logstash,作为Indexer的角色,负责从Redis中取出数据,对数据进行格式化和相关处理后,输出到Elasticsearch中存储;
    3)部署Elasticsearch集群,当然取决于你的数据量了,数据量小的话可以使用单台服务,如果做集群的话,最好是有3个以上节点,同时还需要部署相关的监控插件;
    4)部署Kibana服务,提供Web服务。

    在前期部署阶段,主要工作是Logstash节点和Elasticsearch集群的部署,而在后期使用阶段,主要工作就是Elasticsearch集群的监控和使用Kibana来检索、分析日志数据了,当然也可以直接编写程序来消费Elasticsearch中的数据。

    在上面的部署方案中,我们将Logstash分为Shipper和Indexer两种角色来完成不同的工作,中间通过Redis做数据管道,为什么要这样做?为什么不是直接在每台机器上使用Logstash提取数据、处理、存入Elasticsearch?

    首先,采用这样的架构部署,有三点优势:第一,降低对日志所在机器的影响,这些机器上一般都部署着反向代理或应用服务,本身负载就很重了,所以尽可能的在这些机器上少做事;第二,如果有很多台机器需要做日志收集,那么让每台机器都向Elasticsearch持续写入数据,必然会对Elasticsearch造成压力,因此需要对数据进行缓冲,同时,这样的缓冲也可以一定程度的保护数据不丢失;第三,将日志数据的格式化与处理放到Indexer中统一做,可以在一处修改代码、部署,避免需要到多台机器上去修改配置。

    其次,我们需要做的是将数据放入一个消息队列中进行缓冲,所以Redis只是其中一个选择,也可以是RabbitMQ、Kafka等等,在实际生产中,Redis与Kafka用的比较多。由于Redis集群一般都是通过key来做分片,无法对list类型做集群,在数据量大的时候必然不合适了,而Kafka天生就是分布式的消息队列系统。

    1)配置nginx日志格式
    首先需要将nginx日志格式规范化,便于做解析处理。在nginx.conf文件中设置:

    1

    2

    log_format main ‘remoteaddr"remote_addr "time_iso8601" “$request” $status bodybytessent"body_bytes_sent "http_user_agent" “httpreferer""http_referer" "http_x_forwarded_for” “requesttime""request_time" "upstream_response_time” “httpcookie""http_cookie" "http_Authorization” “$http_token”’;

    access_log /var/log/nginx/example.access.log main;

    2)nginx日志–>>Logstash–>>消息队列
    这部分是Logstash Shipper的工作,涉及input和output两种插件。input部分,由于需要提取的是日志文件,一般使用file插件,该插件常用的几个参数是:
    path:指定日志文件路径。
    type:指定一个名称,设置type后,可以在后面的filter和output中对不同的type做不同的处理,适用于需要消费多个日志文件的场景。
    start_position:指定起始读取位置,“beginning”表示从文件头开始,“end”表示从文件尾开始(类似tail -f)。
    sincedb_path:与Logstash的一个坑有关。通常Logstash会记录每个文件已经被读取到的位置,保存在sincedb中,如果Logstash重启,那么对于同一个文件,会继续从上次记录的位置开始读取。如果想重新从头读取文件,需要删除sincedb文件,sincedb_path则是指定了该文件的路径。为了方便,我们可以根据需要将其设置为“/dev/null”,即不保存位置信息。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    input {

    file {
    
        type => "example_nginx_access"
    
        path => ["/var/log/nginx/example.access.log"]
    
    
    
        start_position => "beginning"
    
        sincedb_path => "/dev/null"
    
    }
    

    }

    output部分,将数据输出到消息队列,以redis为例,需要指定redis server和list key名称。另外,在测试阶段,可以使用stdout来查看输出信息。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    输出到redis

    output {

    if [type] == "example_nginx_access" {
    
        redis {
    
            host => "127.0.0.1"
    
            port => "6379"
    
            data_type => "list"
    
            key => "logstash:example_nginx_access"
    
        }
    
      #  stdout {codec => rubydebug}
    
    }
    

    }

    3)消息队列–>>Logstash–>>Elasticsearch
    这部分是Logstash Indexer的工作,涉及input、filter和output三种插件。在input部分,我们通过redis插件将数据从消息队列中取出来。在output部分,我们通过elasticsearch插件将数据写入Elasticsearch。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    从redis输入数据

    input {

    redis {
    
            host => "127.0.0.1"
    
            port => "6379"
    
            data_type => "list"
    
            key => "logstash:example_nginx_access"
    
    }
    

    }

    output {

    elasticsearch {
    
        index => "logstash-example-nginx-%{+YYYY.MM}"
    
        hosts => ["127.0.0.1:9200"]
    
    }
    

    }

    这里,需要重点关注filter部分,下面列举几个常用的插件,实际使用中根据自身需求从官方文档中查找适合自己业务的插件并使用即可,当然也可以编写自己的插件。
    grok:是Logstash最重要的一个插件,用于将非结构化的文本数据转化为结构化的数据。grok内部使用正则语法对文本数据进行匹配,为了降低使用复杂度,其提供了一组pattern,我们可以直接调用pattern而不需要自己写正则表达式,参考源码grok-patterns。grok解析文本的语法格式是%{SYNTAX:SEMANTIC},SYNTAX是pattern名称,SEMANTIC是需要生成的字段名称,使用工具Grok Debugger可以对解析语法进行调试。例如,在下面的配置中,我们先使用grok对输入的原始nginx日志信息(默认以message作为字段名)进行解析,并添加新的字段request_path_with_verb(该字段的值是verb和request_path的组合),然后对request_path字段做进一步解析。
    kv:用于将某个字段的值进行分解,类似于编程语言中的字符串Split。在下面的配置中,我们将request_args字段值按照“&”进行分解,分解后的字段名称以“request_args_”作为前缀,并且丢弃重复的字段。
    geoip:用于根据IP信息生成地理位置信息,默认使用自带的一份GeoLiteCity database,也可以自己更换为最新的数据库,但是需要数据格式需要遵循Maxmind的格式(参考GeoLite),似乎目前只能支持legacy database,数据类型必须是.dat。下载GeoLiteCity.dat.gz后解压, 并将文件路径配置到source中即可。
    translate:用于检测某字段的值是否符合条件,如果符合条件则将其翻译成新的值,写入一个新的字段,匹配pattern可以通过YAML文件来配置。例如,在下面的配置中,我们对request_api字段翻译成更加易懂的文字描述。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    filter {

    grok {
    
        match => {"message" => "%{IPORHOST:client_ip} \"%{TIMESTAMP_ISO8601:timestamp}\" \"%{WORD:verb} %{NOTSPACE:request_path} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response_status:int} %{NUMBER:response_body_bytes:int} \"%{DATA:user_agent}\" \"%{DATA:http_referer}\" \"%{NOTSPACE:http_x_forwarder_for}\" \"%{NUMBER:request_time:float}\" \"%{DATA:upstream_resopnse_time}\" \"%{DATA:http_cookie}\" \"%{DATA:http_authorization}\" \"%{DATA:http_token}\""}
    
        add_field => {"request_path_with_verb" => "%{verb} %{request_path}"}
    
    }
    
    
    
    grok {
    
        match => {"request_path" => "%{URIPATH:request_api}(?:\?%{NOTSPACE:request_args}|)"}
    
        add_field => {"request_annotation" => "%{request_api}"}
    
    }
    
    
    
    kv {
    
        prefix => "request_args_"
    
        field_split => "&"
    
        source => "request_args"
    
        allow_duplicate_values => false
    
    }
    
    
    
    geoip {
    
        source => "client_ip"
    
        database => "/home/elktest/geoip_data/GeoLiteCity.dat"
    
    }
    

    translate {

        field => request_path
    
        destination => request_annotation
    
        regex => true
    
        exact => true
    
        dictionary_path => "/home/elktest/api_annotation.yaml"
    
        override => true
    
    }
    

    }

    Elasticsearch
    Elasticsearch承载了数据存储和查询的功能,其基础概念和使用方法可以参考另一篇博文Elasticsearch使用总结,这里主要介绍些实际生产中的问题和方法:
    1)关于集群配置,重点关注三个参数:第一,discovery.zen.ping.unicast.hosts,Elasticsearch默认使用Zen Discovery来做节点发现机制,推荐使用unicast来做通信方式,在该配置项中列举出Master节点。第二,discovery.zen.minimum_master_nodes,该参数表示集群中可工作的具有Master节点资格的最小数量,默认值是1。为了提高集群的可用性,避免脑裂现象(所谓脑裂,就是同一个集群中的不同节点,对集群的状态有不一致的理解。),官方推荐设置为(N/2)+1,其中N是具有Master资格的节点的数量。第三,discovery.zen.ping_timeout,表示节点在发现过程中的等待时间,默认值是3秒,可以根据自身网络环境进行调整,一定程度上提供可用性。

    1

    2

    3

    discovery.zen.ping.unicast.hosts: [“master1”, “master2”, “master3”]

    discovery.zen.minimum_master_nodes: 2

    discovery.zen.ping_timeout: 10

    2)关于集群节点,第一,节点类型包括:候选Master节点、数据节点和Client节点。通过设置两个配置项node.master和node.data为true或false,来决定将一个节点分配为什么类型的节点。第二,尽量将候选Master节点和Data节点分离开,通常Data节点负载较重,需要考虑单独部署。
    3)关于内存,Elasticsearch默认设置的内存是1GB,对于任何一个业务部署来说,这个都太小了。通过指定ES_HEAP_SIZE环境变量,可以修改其堆内存大小,服务进程在启动时候会读取这个变量,并相应的设置堆的大小。建议设置系统内存的一半给Elasticsearch,但是不要超过32GB。参考官方文档。
    4)关于硬盘空间,Elasticsearch默认将数据存储在/var/lib/elasticsearch路径下,随着数据的增长,一定会出现硬盘空间不够用的情形,此时就需要给机器挂载新的硬盘,并将Elasticsearch的路径配置到新硬盘的路径下。通过“path.data”配置项来进行设置,比如“path.data: /data1,/var/lib/elasticsearch,/data”。需要注意的是,同一分片下的数据只能写入到一个路径下,因此还是需要合理的规划和监控硬盘的使用。
    5)关于Index的划分和分片的个数,这个需要根据数据量来做权衡了,Index可以按时间划分,比如每月一个或者每天一个,在Logstash输出时进行配置,shard的数量也需要做好控制。
    6)关于监控,笔者使用过head和marvel两个监控插件,head免费,功能相对有限,marvel现在需要收费了。另外,不要在数据节点开启监控插件。

    Kibana
    Kibana提供的是数据查询和显示的Web服务,有丰富的图表样板,能满足大部分的数据可视化需求,这也是很多人选择ELK的主要原因之一。UI的操作没有什么特别需要介绍的,经常使用就会熟练,这里主要介绍经常遇到的三个问题。
    a)查询语法
    在Kibana的Discover页面中,可以输入一个查询条件来查询所需的数据。查询条件的写法使用的是Elasticsearch的Query String语法,而不是Query DSL,参考官方文档query-string-syntax,这里列举其中部分常用的:
    .单字段的全文检索,比如搜索args字段中包含first的文档,写作 args:first;
    .单字段的精确检索,比如搜索args字段值为first的文档,写作 args: “first”;
    .多个检索条件的组合,使用 NOT, AND 和 OR 来组合,注意必须是大写,比如 args:(“first” OR “second”) AND NOT agent: “third”;
    .字段是否存在,exists:agent表示要求agent字段存在,missing:agent表示要求agent字段不存在;
    .通配符:用 ? 表示单字母,* 表示任意个字母。
    b)错误“Discover: Request Timeout after 30000ms”
    这个错误经常发生在要查询的数据量比较大的情况下,此时Elasticsearch需要较长时间才能返回,导致Kibana发生Timeout报错。解决这个问题的方法,就是在Kibana的配置文件中修改elasticsearch.requestTimeout一项的值,然后重启Kibana服务即可,注意单位是ms。
    c)疑惑“字符串被分解了”
    经常碰到这样一个问题:为什么查询结果的字段值是正确的,可是做图表时却发现字段值被分解了,不是想要的结果?如下图所示的client_agent_info字段。

    得到这样一个不正确结果的原因是使用了Analyzed字段来做图表分析,默认情况下Elasticsearch会对字符串数据进行分析,建立倒排索引,所以如果对这么一个字段进行terms聚合,必然会得到上面所示的错误结果了。那么应该怎么做才对?默认情况下,Elasticsearch还会创建一个相对应的没有被Analyzed的字段,即带“.raw”后缀的字段,在这样的字段上做聚合分析即可。
    又会有很多人问这样的问题:为什么我的Elasticsearch没有自动创建带“.raw”后缀的字段?然而在Logstash中输出数据时,设置index名称前缀为“logstash-”就有了这个字段。这个问题的根源是Elasticsearch的dynamic template在捣鬼,dynamic temlate用于指导Elasticsearch如何为插入的数据自动建立Schema映射关系,默认情况下,Logstash会在Elasticsearch中建立一个名为“logstash”的模板,所有前缀为“logstash-”的index都会参照这个模板来建立映射关系,在该模板中申明了要为每个字符串数据建立一个额外的带“.raw”后缀的字段。可以向Elasticsearch来查询你的模板,使用API:GET http://localhost:9200/_template。

    以上便是对ELK日志系统的总结介绍,还有一个重要的功能没有提到,就是如何将日志数据与自身产品业务的数据融合起来。举个例子,在nginx日志中,通常会包含API请求访问时携带的用户Token信息,由于Token是有时效性的,我们需要及时将这些Token转换成真实的用户信息存储下来。这样的需求通常有两种实现方式,一种是自己写一个Logstash filter,然后在Logstash处理数据时调用;另一种是将Logstash Indexer产生的数据再次输出到消息队列中,由我们自己的脚本程序从消息队列中取出数据,做相应的业务处理后,输出到Elasticsearch中。

    ELK环境部署

    (0)基础环境介绍

    系统: Centos7.1
    防火墙: 关闭
    Sellinux: 关闭

    机器环境: 两台
    elk-node1: 192.168.1.160 #master机器
    elk-node2:192.168.1.161 #slave机器

    注明:
    master-slave模式:
    master收集到日志后,会把一部分数据碎片到salve上(随机的一部分数据);同时,master和slave又都会各自做副本,并把副本放到对方机器上,这样就保证了数据不会丢失。
    如果master宕机了,那么客户端在日志采集配置中将elasticsearch主机指向改为slave,就可以保证ELK日志的正常采集和web展示。

    ==========================================================================
    由于elk-node1和elk-node2两台是虚拟机,没有外网ip,所以访问需要通过宿主机进行代理转发实现。

    有以下两种转发设置:(任选其一)

    通过访问宿主机的19200,19201端口分别转发到elk-node1,elk-node2的9200端口
    通过访问宿主机的15601端口转发到elk-node1的5601端口

    宿主机:112.110.115.10(内网ip为192.168.1.7) (为了不让线上的真实ip暴露,这里任意给了一个ip做记录)

    a)通过宿主机的haproxy服务进行代理转发,如下是宿主机上的代理配置:

    [root@kvm-server conf]# pwd
    /usr/local/haproxy/conf
    [root@kvm-server conf]# cat haproxy.cfg


    listen node1-9200 0.0.0.0:19200
    mode tcp
    option tcplog
    balance roundrobin
    server 192.168.1.160 192.168.1.160:9200 weight 1 check inter 1s rise 2 fall 2

    listen node2-9200 0.0.0.0:19201
    mode tcp
    option tcplog
    balance roundrobin
    server 192.168.1.161 192.168.1.161:9200 weight 1 check inter 1s rise 2 fall 2

    listen node1-5601 0.0.0.0:15601
    mode tcp
    option tcplog
    balance roundrobin
    server 192.168.1.160 192.168.1.160:5601 weight 1 check inter 1s rise 2 fall 2

    重启haproxy服务
    [root@kvm-server conf]# /etc/init.d/haproxy restart

    设置宿主机防火墙
    [root@kvm-server conf]# cat /etc/sysconfig/iptables

    -A INPUT -p tcp -m state --state NEW -m tcp --dport 19200 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 19201 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 15601 -j ACCEPT

    [root@kvm-server conf]# /etc/init.d/iptables restart

    b)通过宿主机的NAT端口转发实现

    [root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 19200 -j DNAT --to-destination 192.168.1.160:9200
    [root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 9200 -j SNAT --to-source 192.168.1.7
    [root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 19200 -j ACCEPT

    [root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 19201 -j DNAT --to-destination 192.168.1.161:9200
    [root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 9200 -j SNAT --to-source 192.168.1.7
    [root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 19201 -j ACCEPT

    [root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 15601 -j DNAT --to-destination 192.168.1.160:5601
    [root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 5601 -j SNAT --to-source 192.168.1.7
    [root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 15601 -j ACCEPT

    [root@kvm-server conf]# service iptables save
    [root@kvm-server conf]# service iptables restart

    提醒一点:
    nat端口转发设置成功后,/etc/sysconfig/iptables文件里要注释掉下面两行!不然nat转发会有问题!一般如上面在nat转发规则设置好并save和restart防火墙之后就会自动在/etc/sysconfig/iptables文件里删除掉下面两行内容了。
    [root@kvm-server conf]# vim /etc/sysconfig/iptables

    #-A INPUT -j REJECT --reject-with icmp-host-prohibited
    #-A FORWARD -j REJECT --reject-with icmp-host-prohibited
    [root@linux-node1 ~]# service iptables restart

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

    (1)Elasticsearch安装配置

    基础环境安装(elk-node1和elk-node2同时操作)

    1)下载并安装GPG Key
    [root@elk-node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

    2)添加yum仓库
    [root@elk-node1 ~]# vim /etc/yum.repos.d/elasticsearch.repo
    [elasticsearch-2.x]
    name=Elasticsearch repository for 2.x packages
    baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
    gpgcheck=1
    gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
    enabled=1

    3)安装elasticsearch
    [root@elk-node1 ~]# yum install -y elasticsearch

    4)安装相关测试软件
    #提前先下载安装epel源:epel-release-latest-7.noarch.rpm,否则yum会报错:No Package…
    [root@elk-node1 ~]# wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    [root@elk-node1 ~]# rpm -ivh epel-release-latest-7.noarch.rpm
    #安装Redis
    [root@elk-node1 ~]# yum install -y redis
    #安装Nginx
    [root@elk-node1 ~]# yum install -y nginx
    #安装java
    [root@elk-node1 ~]# yum install -y java

    安装完java后,检测
    [root@elk-node1 ~]# java -version
    openjdk version “1.8.0_102”
    OpenJDK Runtime Environment (build 1.8.0_102-b14)
    OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

    配置部署(下面先进行elk-node1的配置)

    1)配置修改配置文件
    [root@elk-node1 ~]# mkdir -p /data/es-data
    [root@elk-node1 ~]# vim /etc/elasticsearch/elasticsearch.yml 【将里面内容情况,配置下面内容】
    cluster.name: huanqiu # 组名(同一个组,组名必须一致)
    node.name: elk-node1 # 节点名称,建议和主机名一致
    path.data: /data/es-data # 数据存放的路径
    path.logs: /var/log/elasticsearch/ # 日志存放的路径
    bootstrap.mlockall: true # 锁住内存,不被使用到交换分区去
    network.host: 0.0.0.0 # 网络设置
    http.port: 9200 # 端口

    2)启动并查看
    [root@elk-node1 ~]# chown -R elasticsearch.elasticsearch /data/
    [root@elk-node1 ~]# systemctl start elasticsearch
    [root@elk-node1 ~]# systemctl status elasticsearch
    CGroup: /system.slice/elasticsearch.service
    └─3005 /bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSI…

    注意:上面可以看出elasticsearch设置的内存最小256m,最大1g

    ===温馨提示: Elasticsearch启动出现"could not find java"=

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    yum方法安装elasticsearch, 使用"systemctl start elasticsearch"启动服务失败.

    "systemctl status elasticsearch"查看, 发现报错说could not find java

    但是"java -version" 查看发现java已经安装了

    这是因为elasticsearch在启动过程中, 引用的java路径找不到

    解决办法: 在elasticsearch配置文件中定义java全路径

    [root@elk-node01 ~]# java -version

    java version “1.8.0_131”

    Java™ SE Runtime Environment (build 1.8.0_131-b11)

    Java HotSpot™ 64-Bit Server VM (build 25.131-b11, mixed mode

    [root@elk-node01 ~]# find / -name java

    /var/lib/alternatives/java

    /usr/share/swig/2.0.10/java

    /usr/java

    /usr/java/jdk1.8.0_131/bin/java

    /usr/java/jdk1.8.0_131/jre/bin/java

    /usr/bin/java

    /etc/pki/java

    /etc/pki/ca-trust/extracted/java

    /etc/alternatives/java

    [root@elk-node01 ~]# vim /etc/sysconfig/elasticsearch

    添加JAVA_HOME环境变量的配置

    JAVA_HOME=/usr/java/jdk1.8.0_131

    [root@linux-node1 src]# netstat -antlp |egrep “9200|9300”
    tcp6 0 0 :::9200 ::? LISTEN 3005/java
    tcp6 0 0 :::9300 ::? LISTEN 3005/java

    然后通过web访问(访问的浏览器最好用google浏览器)

    http://112.110.115.10:19200/

    3)通过命令的方式查看数据(在112.110.115.10宿主机或其他外网服务器上查看,如下)
    [root@kvm-server src]# curl -i -XGET ‘http://192.168.1.160:9200/_count?pretty’ -d ‘{“query”:{“match_all”:{}}}’
    HTTP/1.1 200 OK
    Content-Type: application/json; charset=UTF-8
    Content-Length: 95

    {
    “count” : 0,
    “_shards” : {
    “total” : 0,
    “successful” : 0,
    “failed” : 0
    }
    }

    这样感觉用命令来查看,特别的不爽。

    4)接下来安装插件,使用插件进行查看~ (下面两个插件要在elk-node1和elk-node2上都要安装)
    4.1)安装head插件

    a)插件安装方法一
    [root@elk-node1 src]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head

    b)插件安装方法二
    首先下载head插件,下载到/usr/loca/src目录下
    下载地址:https://github.com/mobz/elasticsearch-head

    ======================================================
    head插件包百度云盘下载:https://pan.baidu.com/s/1boBE0qj
    提取密码:ifj7

    [root@elk-node1 src]# unzip elasticsearch-head-master.zip
    [root@elk-node1 src]# ls
    elasticsearch-head-master elasticsearch-head-master.zip

    在/usr/share/elasticsearch/plugins目录下创建head目录
    然后将上面下载的elasticsearch-head-master.zip解压后的文件都移到/usr/share/elasticsearch/plugins/head下
    接着重启elasticsearch服务即可!
    [root@elk-node1 src]# cd /usr/share/elasticsearch/plugins/
    [root@elk-node1 plugins]# mkdir head
    [root@elk-node1 plugins]# ls
    head
    [root@elk-node1 plugins]# cd head
    [root@elk-node1 head]# cp -r /usr/local/src/elasticsearch-head-master/* ./
    [root@elk-node1 head]# pwd
    /usr/share/elasticsearch/plugins/head

    [root@elk-node1 head]# chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/plugins
    [root@elk-node1 head]# ll
    total 40
    -rw-r–r--. 1 elasticsearch elasticsearch 104 Sep 28 01:57 elasticsearch-head.sublime-project
    -rw-r–r--. 1 elasticsearch elasticsearch 2171 Sep 28 01:57 Gruntfile.js
    -rw-r–r--. 1 elasticsearch elasticsearch 3482 Sep 28 01:57 grunt_fileSets.js
    -rw-r–r--. 1 elasticsearch elasticsearch 1085 Sep 28 01:57 index.html
    -rw-r–r--. 1 elasticsearch elasticsearch 559 Sep 28 01:57 LICENCE
    -rw-r–r--. 1 elasticsearch elasticsearch 795 Sep 28 01:57 package.json
    -rw-r–r--. 1 elasticsearch elasticsearch 100 Sep 28 01:57 plugin-descriptor.properties
    -rw-r–r--. 1 elasticsearch elasticsearch 5211 Sep 28 01:57 README.textile
    drwxr-xr-x. 5 elasticsearch elasticsearch 4096 Sep 28 01:57 _site
    drwxr-xr-x. 4 elasticsearch elasticsearch 29 Sep 28 01:57 src
    drwxr-xr-x. 4 elasticsearch elasticsearch 66 Sep 28 01:57 test

    [root@elk-node1 _site]# systemctl restart elasticsearch

    插件访问(最好提前将elk-node2节点的配置和插件都安装后,再来进行访问和数据插入测试)
    http://112.110.115.10:19200/_plugin/head/

    先插入数据实例,测试下
    如下:打开”复合查询“,在POST选项下,任意输入如/index-demo/test,然后在下面输入数据(注意内容之间换行的逗号不要漏掉);
    数据输入好之后(如下输入wangshibo;hello world内容),下面点击”验证JSON“->”提交请求“,提交成功后,观察右栏里出现的信息:有index,type,version等信息,failed:0(成功消息)

    再查看测试实例,如下:
    "复合查询"下,选择GET选项,在/index-demo/test/后面输入上面POST结果中的id号,不输入内容,即{}括号里为空!
    然后点击”验证JSON“->“提交请求”,观察右栏内就有了上面插入的数据了(即wangshibo,hello world)

    打开"基本查询",查看下数据,如下,即可查询到上面插入的数据:

    打开“数据浏览”,也能查看到插入的数据:

    如下:一定要提前在elk-node2节点上也完成配置(配置内容在下面提到),否则上面插入数据后,集群状态会呈现黄色yellow状态,elk-node2完成配置加入到集群里后就会恢复到正常的绿色状态。

    4.2)安装kopf监控插件

    a)监控插件安装方法一

    [root@elk-node1 src]# /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf

    b)监控插件安装方法二

    首先下载监控插件kopf,下载到/usr/loca/src目录下
    下载地址:https://github.com/lmenezes/elasticsearch-kopf

    ====================================================
    kopf插件包百度云盘下载:https://pan.baidu.com/s/1qYixSL2
    提取密码:ya4t

    [root@elk-node1 src]# unzip elasticsearch-kopf-master.zip
    [root@elk-node1 src]# ls
    elasticsearch-kopf-master elasticsearch-kopf-master.zip

    在/usr/share/elasticsearch/plugins目录下创建kopf目录
    然后将上面下载的elasticsearch-kopf-master.zip解压后的文件都移到/usr/share/elasticsearch/plugins/kopf下
    接着重启elasticsearch服务即可!
    [root@elk-node1 src]# cd /usr/share/elasticsearch/plugins/
    [root@elk-node1 plugins]# mkdir kopf
    [root@elk-node1 plugins]# cd kopf
    [root@elk-node1 kopf]# cp -r /usr/local/src/elasticsearch-kopf-master/* ./
    [root@elk-node1 kopf]# pwd
    /usr/share/elasticsearch/plugins/kopf

    [root@elk-node1 kopf]# chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/plugins
    [root@elk-node1 kopf]# ll
    total 40
    -rw-r–r--. 1 elasticsearch elasticsearch 237 Sep 28 16:28 CHANGELOG.md
    drwxr-xr-x. 2 elasticsearch elasticsearch 22 Sep 28 16:28 dataset
    drwxr-xr-x. 2 elasticsearch elasticsearch 73 Sep 28 16:28 docker
    -rw-r–r--. 1 elasticsearch elasticsearch 4315 Sep 28 16:28 Gruntfile.js
    drwxr-xr-x. 2 elasticsearch elasticsearch 4096 Sep 28 16:28 imgs
    -rw-r–r--. 1 elasticsearch elasticsearch 1083 Sep 28 16:28 LICENSE
    -rw-r–r--. 1 elasticsearch elasticsearch 1276 Sep 28 16:28 package.json
    -rw-r–r--. 1 elasticsearch elasticsearch 102 Sep 28 16:28 plugin-descriptor.properties
    -rw-r–r--. 1 elasticsearch elasticsearch 3165 Sep 28 16:28 README.md
    drwxr-xr-x. 6 elasticsearch elasticsearch 4096 Sep 28 16:28 _site
    drwxr-xr-x. 4 elasticsearch elasticsearch 27 Sep 28 16:28 src
    drwxr-xr-x. 4 elasticsearch elasticsearch 4096 Sep 28 16:28 tests

    [root@elk-node1 _site]# systemctl restart elasticsearch

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

    访问插件:(如下,同样要提前安装好elk-node2节点上的插件,否则访问时会出现集群节点为黄色的yellow告警状态)

    http://112.110.115.10:19200/_plugin/kopf/#!/cluster


    下面进行节点elk-node2的配置 (如上的两个插件也在elk-node2上同样安装)

    注释:其实两个的安装配置基本上是一样的。

    [root@elk-node2 src]# mkdir -p /data/es-data
    [root@elk-node2 ~]# cat /etc/elasticsearch/elasticsearch.yml
    cluster.name: huanqiu
    node.name: elk-node2
    path.data: /data/es-data
    path.logs: /var/log/elasticsearch/
    bootstrap.mlockall: true
    network.host: 0.0.0.0
    http.port: 9200
    discovery.zen.ping.multicast.enabled: false
    discovery.zen.ping.unicast.hosts: [“192.168.1.160”, “192.168.1.161”]

    修改权限配置

    [root@elk-node2 src]# chown -R elasticsearch.elasticsearch /data/

    启动服务

    [root@elk-node2 src]# systemctl start elasticsearch
    [root@elk-node2 src]# systemctl status elasticsearch
    ● elasticsearch.service - Elasticsearch
    Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
    Active: active (running) since Wed 2016-09-28 16:49:41 CST; 1 weeks 3 days ago
    Docs: http://www.elastic.co
    Process: 17798 ExecStartPre=/usr/share/elasticsearch/bin/elasticsearch-systemd-pre-exec (code=exited, status=0/SUCCESS)
    Main PID: 17800 (java)
    CGroup: /system.slice/elasticsearch.service
    └─17800 /bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFra…

    Oct 09 13:42:22 elk-node2 elasticsearch[17800]: [2016-10-09 13:42:22,295][WARN ][transport ] [elk-node2] Transport res…943817]
    Oct 09 13:42:23 elk-node2 elasticsearch[17800]: [2016-10-09 13:42:23,111][WARN ][transport ] [elk-node2] Transport res…943846]

    查看端口

    [root@elk-node2 src]# netstat -antlp|egrep “9200|9300”
    tcp6 0 0 :::9200 ::? LISTEN 2928/java
    tcp6 0 0 :::9300 ::? LISTEN 2928/java
    tcp6 0 0 127.0.0.1:48200 127.0.0.1:9300 TIME_WAIT -
    tcp6 0 0 ::1:41892 ::1:9300 TIME_WAIT -


    通过命令的方式查看elk-node2数据(在112.110.115.10宿主机或其他外网服务器上查看,如下)
    [root@kvm-server ~]# curl -i -XGET ‘http://192.168.1.161:9200/_count?pretty’ -d ‘{“query”:{“match_all”:{}}}’
    HTTP/1.1 200 OK
    Content-Type: application/json; charset=UTF-8
    Content-Length: 95

    {
    “count” : 1,
    “_shards” : {
    “total” : 5,
    “successful” : 5,
    “failed” : 0
    }

    然后通过web访问elk-node2
    http://112.110.115.10:19201/

    访问两个插件:
    http://112.110.115.10:19201/_plugin/head/
    http://112.110.115.10:19201/_plugin/kopf/#!/cluster

    (2)Logstash安装配置(这个在客户机上是要安装的。elk-node1和elk-node2都安装)

    基础环境安装(客户端安装logstash,收集到的数据写入到elasticsearch里,就可以登陆logstash界面查看到了)

    1)下载并安装GPG Key
    [root@elk-node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

    2)添加yum仓库
    [root@hadoop-node1 ~]# vim /etc/yum.repos.d/logstash.repo
    [logstash-2.1]
    name=Logstash repository for 2.1.x packages
    baseurl=http://packages.elastic.co/logstash/2.1/centos
    gpgcheck=1
    gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
    enabled=1

    3)安装logstash
    [root@elk-node1 ~]# yum install -y logstash

    4)logstash启动
    [root@elk-node1 ~]# systemctl start elasticsearch
    [root@elk-node1 ~]# systemctl status elasticsearch
    ● elasticsearch.service - Elasticsearch
    Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
    Active: active (running) since Mon 2016-11-07 18:33:28 CST; 3 days ago
    Docs: http://www.elastic.co
    Main PID: 8275 (java)
    CGroup: /system.slice/elasticsearch.service
    └─8275 /bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFrac…

    数据的测试

    1)基本的输入输出
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -e ‘input { stdin{} } output { stdout{} }’
    Settings: Default filter workers: 1
    Logstash startup completed
    hello #输入这个
    2016-11-11T06:41:07.690Z elk-node1 hello #输出这个
    wangshibo #输入这个
    2016-11-11T06:41:10.608Z elk-node1 wangshibo #输出这个

    2)使用rubydebug详细输出
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -e ‘input { stdin{} } output { stdout{ codec => rubydebug} }’
    Settings: Default filter workers: 1
    Logstash startup completed
    hello #输入这个
    { #输出下面信息
    “message” => “hello”,
    “@version” => “1”,
    “@timestamp” => “2016-11-11T06:44:06.711Z”,
    “host” => “elk-node1”
    }
    wangshibo #输入这个
    { #输出下面信息
    “message” => “wangshibo”,
    “@version” => “1”,
    “@timestamp” => “2016-11-11T06:44:11.270Z”,
    “host” => “elk-node1”
    }

    1. 把内容写到elasticsearch中
      [root@elk-node1 ~]# /opt/logstash/bin/logstash -e ‘input { stdin{} } output { elasticsearch { hosts => [“192.168.1.160:9200”]} }’
      Settings: Default filter workers: 1
      Logstash startup completed #输入下面的测试数据
      123456
      wangshibo
      huanqiu
      hahaha

    使用rubydebug和写到elasticsearch中的区别:其实就在于后面标准输出的区别,前者使用codec;后者使用elasticsearch

    写到elasticsearch中在logstash中查看,如下图:
    注意:
    master收集到日志后,会把一部分数据碎片到salve上(随机的一部分数据),master和slave又都会各自做副本,并把副本放到对方机器上,这样就保证了数据不会丢失。
    如下,master收集到的数据放到了自己的第1,3分片上,其他的放到了slave的第0,2,4分片上。

    4)即写到elasticsearch中又写在文件中一份
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -e ‘input { stdin{} } output { elasticsearch { hosts => [“192.168.1.160:9200”]} stdout{ codec => rubydebug}}’
    Settings: Default filter workers: 1
    Logstash startup completed
    huanqiupc
    {
    “message” => “huanqiupc”,
    “@version” => “1”,
    “@timestamp” => “2016-11-11T07:27:42.012Z”,
    “host” => “elk-node1”
    }
    wangshiboqun
    {
    “message” => “wangshiboqun”,
    “@version” => “1”,
    “@timestamp” => “2016-11-11T07:27:55.396Z”,
    “host” => “elk-node1”
    }

    以上文本可以长期保留、操作简单、压缩比大。下面登陆elasticsearch界面中查看;

    logstash的配置和文件的编写

    1)logstash的配置
    简单的配置方式:
    [root@elk-node1 ~]# vim /etc/logstash/conf.d/01-logstash.conf
    input { stdin { } }
    output {
    elasticsearch { hosts => [“192.168.1.160:9200”]}
    stdout { codec => rubydebug }
    }

    它的执行:
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f /etc/logstash/conf.d/01-logstash.conf
    Settings: Default filter workers: 1
    Logstash startup completed
    beijing #输入内容
    { #输出下面信息
    “message” => “beijing”,
    “@version” => “1”,
    “@timestamp” => “2016-11-11T07:41:48.401Z”,
    “host” => “elk-node1”
    }

    ===============================================================
    参考内容:
    https://www.elastic.co/guide/en/logstash/current/configuration.html
    https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html

    2)收集系统日志

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    [root@elk-node1 ~]# vim file.conf

    input {

    file {
    
      path => "/var/log/messages"
    
      type => "system"
    
      start_position => "beginning"
    
    }
    

    }

    output {

    elasticsearch {
    
       hosts => ["192.168.1.160:9200"]
    
       index => "system-%{+YYYY.MM.dd}"
    
    }
    

    }

    执行上面日志信息的收集,如下,这个命令会一直在执行中,表示日志在监控收集中;如果中断,就表示日志不在收集!所以需要放在后台执行~
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f file.conf &

    登陆elasticsearch界面,查看本机系统日志的信息:

    ================================================================
    参考内容:
    https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html

    3)收集java日志,其中包含上面讲到的日志收集

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    [root@elk-node1 ~]# vim file.conf

    input {

    file {
    
      path => "/var/log/messages"
    
      type => "system"
    
      start_position => "beginning"
    
    }
    

    }

    input {

    file {
    
       path => "/var/log/elasticsearch/huanqiu.log"
    
       type => "es-error"
    
       start_position => "beginning"
    
    }
    

    }

    output {

    if [type] == "system"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "system-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    
    
    if [type] == "es-error"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "es-error-%{+YYYY.MM.dd}"
    
        }
    
    }
    

    }

    注意:
    如果你的日志中有type字段 那你就不能在conf文件中使用type

    执行如下命令收集:
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f file.conf &

    登陆elasticsearch界面,查看数据:

    ====================================================================
    参考内容:
    https://www.elastic.co/guide/en/logstash/current/event-dependent-configuration.html

    有个问题:
    每个报错都给收集成一行了,不是按照一个报错,一个事件模块收集的。

    下面将行换成事件的方式展示:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    [root@elk-node1 ~]# vim multiline.conf

    input {

    stdin {
    
       codec => multiline {
    
          pattern => "^\["
    
          negate => true
    
          what => "previous"
    
        }
    
    }
    

    }

    output {

    stdout {
    
      codec => "rubydebug"
    
     }  
    

    }

    执行命令:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f multiline.conf

    Settings: Default filter workers: 1

    Logstash startup completed

    123

    456

    [123

    {

    "@timestamp" => "2016-11-11T09:28:56.824Z",
    
       "message" => "123\n456",
    
      "@version" => "1",
    
          "tags" => [
    
        [0] "multiline"
    
    ],
    
          "host" => "elk-node1"
    

    }

    123]

    [456]

    {

    "@timestamp" => "2016-11-11T09:29:09.043Z",
    
       "message" => "[123\n123]",
    
      "@version" => "1",
    
          "tags" => [
    
        [0] "multiline"
    
    ],
    
          "host" => "elk-node1"
    

    }

    在没有遇到[的时候,系统不会收集,只有遇见[的时候,才算是一个事件,才收集起来。

    参考内容
    https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html

    (3)Kibana安装配置

    1)kibana的安装:
    [root@elk-node1 ~]# cd /usr/local/src
    [root@elk-node1 src]# wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
    [root@elk-node1 src]# tar zxf kibana-4.3.1-linux-x64.tar.gz
    [root@elk-node1 src]# mv kibana-4.3.1-linux-x64 /usr/local/
    [root@elk-node1 src]# ln -s /usr/local/kibana-4.3.1-linux-x64/ /usr/local/kibana

    2)修改配置文件:
    [root@elk-node1 config]# pwd
    /usr/local/kibana/config
    [root@elk-node1 config]# cp kibana.yml kibana.yml.bak
    [root@elk-node1 config]# vim kibana.yml
    server.port: 5601
    server.host: “0.0.0.0”
    elasticsearch.url: “http://192.168.1.160:9200
    kibana.index: “.kibana” #注意这个.Kibana索引用来存储数据,千万不要删除了它。它是将es数据通过kibana进行web展示的关键。这个配置后,在es的web界面里就会看到这个.kibana索引。

    因为他一直运行在前台,要么选择开一个窗口,要么选择使用screen。
    安装并使用screen启动kibana:
    [root@elk-node1 ~]# yum -y install screen
    [root@elk-node1 ~]# screen #这样就另开启了一个终端窗口
    [root@elk-node1 ~]# /usr/local/kibana/bin/kibana
    log [18:23:19.867] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready
    log [18:23:19.911] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch
    log [18:23:19.941] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready
    log [18:23:19.953] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready
    log [18:23:19.963] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready
    log [18:23:19.995] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready
    log [18:23:20.004] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready
    log [18:23:20.010] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready

    然后按ctrl+a+d组合键,这样在上面另启的screen屏里启动的kibana服务就一直运行在前台了…
    [root@elk-node1 ~]# screen -ls
    There is a screen on:
    15041.pts-0.elk-node1 (Detached)
    1 Socket in /var/run/screen/S-root.

    (3)访问kibana:http://112.110.115.10:15601/
    如下,如果是添加上面设置的java日志收集信息,则在下面填写es-error*;如果是添加上面设置的系统日志信息system*,以此类型(可以从logstash界面看到日志收集项)

    然后点击上面的Discover,在Discover中查看:

    查看日志登陆,需要点击“Discover”–>“message”,点击它后面的“add”
    注意:
    需要右边查看日志内容时带什么属性,就在左边点击相应属性后面的“add”
    如下图,添加了message和path的属性:

    这样,右边显示的日志内容的属性就带了message和path

    点击右边日志内容属性后面隐藏的<<,就可将内容向前缩进

    添加新的日志采集项,点击Settings->+Add New,比如添加system系统日志。注意后面的*不要忘了。

    删除kibana里的日志采集项,如下,点击删除图标即可。

    如果打开kibana查看日志,发现没有日志内容,出现“No results found”,如下图所示,这说明要查看的日志在当前时间没有日志信息输出,可以点击右上角的时间钟来调试日志信息的查看。

    4)收集nginx的访问日志

    修改nginx的配置文件,分别在nginx.conf的http和server配置区域添加下面内容:

    http 标签中
          log_format json '{"@timestamp":"$time_iso8601",'
                           '"@version":"1",'
                           '"client":"$remote_addr",'
                           '"url":"$uri",'
                           '"status":"$status",'
                           '"domain":"$host",'
                           '"host":"$server_addr",'
                           '"size":$body_bytes_sent,'
                           '"responsetime":$request_time,'
                           '"referer": "$http_referer",'
                           '"ua": "$http_user_agent"'
    

    ‘}’;

    server标签中
            access_log /var/log/nginx/access_json.log json;
    

    截图如下:

    启动nginx服务:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    [root@elk-node1 ~]# systemctl start nginx

    [root@elk-node1 ~]# systemctl status nginx

    ● nginx.service - The nginx HTTP and reverse proxy server

    Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)

    Active: active (running) since Fri 2016-11-11 19:06:55 CST; 3s ago

    Process: 15119 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)

    Process: 15116 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)

    Process: 15114 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)

    Main PID: 15122 (nginx)

    CGroup: /system.slice/nginx.service

           ├─15122 nginx: master process /usr/sbin/nginx
    
           ├─15123 nginx: worker process
    
           └─15124 nginx: worker process
    

    Nov 11 19:06:54 elk-node1 systemd[1]: Starting The nginx HTTP and reverse proxy server…

    Nov 11 19:06:55 elk-node1 nginx[15116]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

    Nov 11 19:06:55 elk-node1 nginx[15116]: nginx: configuration file /etc/nginx/nginx.conf test is successful

    Nov 11 19:06:55 elk-node1 systemd[1]: Started The nginx HTTP and reverse proxy server.

    编写收集文件
    这次使用json的方式收集:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    [root@elk-node1 ~]# vim json.conf

    input {

    file {

      path => "/var/log/nginx/access_json.log"
    
      codec => "json"
    

    }

    }

    output {

    stdout {

      codec => "rubydebug"
    

    }

    }

    启动日志收集程序:
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f json.conf #或加个&放在后台执行

    访问nginx页面(在elk-node1的宿主机上执行访问页面的命令:curl http://192.168.1.160)就会出现以下内容:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f json.conf

    Settings: Default filter workers: 1

    Logstash startup completed

    {

      "@timestamp" => "2016-11-11T11:10:53.000Z",
    
        "@version" => "1",
    
          "client" => "192.168.1.7",
    
             "url" => "/index.html",
    
          "status" => "200",
    
          "domain" => "192.168.1.160",
    
            "host" => "192.168.1.160",
    
            "size" => 3700,
    
    "responsetime" => 0.0,
    
         "referer" => "-",
    
              "ua" => "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2",
    
            "path" => "/var/log/nginx/access_json.log"
    

    }

    注意:
    上面的json.conf配置只是将nginx日志输出,还没有输入到elasticsearch里,所以这个时候在elasticsearch界面里是采集不到nginx日志的。

    需要配置一下,将nginx日志输入到elasticsearch中,将其汇总到总文件file.conf里,如下也将nginx-log日志输入到elasticserach里:(后续就可以只用这个汇总文件,把要追加的日志汇总到这个总文件里即可)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    [root@elk-node1 ~]# cat file.conf

    input {

    file {
    
      path => "/var/log/messages"
    
      type => "system"
    
      start_position => "beginning"
    
    }
    
    
    
    file {
    
       path => "/var/log/elasticsearch/huanqiu.log"
    
       type => "es-error"
    
       start_position => "beginning"
    
       codec => multiline {
    
           pattern => "^\["
    
           negate => true
    
           what => "previous"
    
       }
    
    }
    
    file {
    
       path => "/var/log/nginx/access_json.log"
    
       codec => json
    
       start_position => "beginning"
    
       type => "nginx-log"
    
    }
    

    }

    output {

    if [type] == "system"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "system-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    
    
    if [type] == "es-error"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "es-error-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    if [type] == "nginx-log"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "nignx-log-%{+YYYY.MM.dd}"
    
        }
    
    }
    

    }

    可以加上–configtest参数,测试下配置文件是否有语法错误或配置不当的地方,这个很重要!!
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f file.conf --configtest
    Configuration OK

    然后接着执行logstash命令(由于上面已经将这个执行命令放到了后台,所以这里其实不用执行,也可以先kill之前的,再放后台执行),然后可以再访问nginx界面测试下
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f file.conf &

    登陆elasticsearch界面查看:

    将nginx日志整合到kibana界面里,如下:

    5)收集系统日志

    编写收集文件并执行。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    [root@elk-node1 ~]# cat syslog.conf

    input {

    syslog {
    
        type => "system-syslog"
    
        host => "192.168.1.160"
    
        port => "514"
    
    }
    

    }

    output {

    stdout {
    
        codec => "rubydebug"
    
    }
    

    }

    对上面的采集文件进行执行:
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f syslog.conf

    重新开启一个窗口,查看服务是否启动:
    [root@elk-node1 ~]# netstat -ntlp|grep 514
    tcp6 0 0 192.168.1.160:514 ::? LISTEN 17842/java
    [root@elk-node1 ~]# vim /etc/rsyslog.conf
    #. @@remote-host:514 【在此行下面添加如下内容】
    . @@192.168.1.160:514

    [root@elk-node1 ~]# systemctl restart rsyslog

    回到原来的窗口(即上面采集文件的执行终端),就会出现数据:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f syslog.conf

    Settings: Default filter workers: 1

    Logstash startup completed

    {

           "message" => "Stopping System Logging Service...\n",
    
          "@version" => "1",
    
        "@timestamp" => "2016-11-13T10:35:30.000Z",
    
              "type" => "system-syslog",
    
              "host" => "192.168.1.160",
    
          "priority" => 30,
    
         "timestamp" => "Nov 13 18:35:30",
    
         "logsource" => "elk-node1",
    
           "program" => "systemd",
    
          "severity" => 6,
    
          "facility" => 3,
    
    "facility_label" => "system",
    
    "severity_label" => "Informational"
    

    }

    再次添加到总文件file.conf中:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    [root@elk-node1 ~]# cat file.conf

    input {

    file {
    
      path => "/var/log/messages"
    
      type => "system"
    
      start_position => "beginning"
    
    }
    
    
    
    file {
    
       path => "/var/log/elasticsearch/huanqiu.log"
    
       type => "es-error"
    
       start_position => "beginning"
    
       codec => multiline {
    
           pattern => "^\["
    
           negate => true
    
           what => "previous"
    
       }
    
    }
    
    file {
    
       path => "/var/log/nginx/access_json.log"
    
       codec => json
    
       start_position => "beginning"
    
       type => "nginx-log"
    
    }
    
    syslog {
    
        type => "system-syslog"
    
        host => "192.168.1.160"
    
        port => "514"
    
    }
    

    }

    output {

    if [type] == "system"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "system-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    
    
    if [type] == "es-error"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "es-error-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    if [type] == "nginx-log"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "nignx-log-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    if [type] == "system-syslog"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "system-syslog-%{+YYYY.MM.dd}"
    
        }
    
    }
    

    }

    执行总文件(先测试下总文件配置是否有误,然后先kill之前在后台启动的file.conf文件,再次执行):
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f file.conf --configtest
    Configuration OK
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f file.conf &

    测试:
    向日志中添加数据,看elasticsearch和kibana的变化:
    [root@elk-node1 ~]# logger “hehehehehehe1”
    [root@elk-node1 ~]# logger “hehehehehehe2”
    [root@elk-node1 ~]# logger “hehehehehehe3”
    [root@elk-node1 ~]# logger “hehehehehehe4”
    [root@elk-node1 ~]# logger “hehehehehehe5”

    添加到kibana界面中:

    6)TCP日志的收集

    编写日志收集文件,并执行:(有需要的话,可以将下面收集文件的配置汇总到上面的总文件file.conf里,进而输入到elasticsearch界面里和kibana里查看)
    [root@elk-node1 ~]# cat tcp.conf
    input {
    tcp {
    host => “192.168.1.160”
    port => “6666”
    }
    }
    output {
    stdout {
    codec => “rubydebug”
    }
    }

    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f tcp.conf

    开启另外一个窗口,测试一(安装nc命令:yum install -y nc):
    [root@elk-node1 ~]# nc 192.168.1.160 6666 </etc/resolv.conf

    回到原来的窗口(即上面采集文件的执行终端),就会出现数据:
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f tcp.conf
    Settings: Default filter workers: 1
    Logstash startup completed
    {
    “message” => “”,
    “@version” => “1”,
    “@timestamp” => “2016-11-13T11:01:15.280Z”,
    “host” => “192.168.1.160”,
    “port” => 49743
    }

    测试二:
    [root@elk-node1 ~]# echo “hehe” | nc 192.168.1.160 6666
    [root@elk-node1 ~]# echo “hehe” > /dev/tcp/192.168.1.160/6666

    回到之前的执行端口,在去查看,就会显示出来:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f tcp.conf

    Settings: Default filter workers: 1

    Logstash startup completed

    {

       "message" => "hehe",
    
      "@version" => "1",
    
    "@timestamp" => "2016-11-13T11:39:58.263Z",
    
          "host" => "192.168.1.160",
    
          "port" => 53432
    

    }

    {

       "message" => "hehe",
    
      "@version" => "1",
    
    "@timestamp" => "2016-11-13T11:40:13.458Z",
    
          "host" => "192.168.1.160",
    
          "port" => 53457
    

    }

    7)使用filter
    编写文件:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    [root@elk-node1 ~]# cat grok.conf

    input {

    stdin{}
    

    }

    filter {

    grok {

    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
    

    }

    }

    output {

    stdout{
    
        codec => "rubydebug"
    
    }
    

    }

    执行检测:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f grok.conf

    Settings: Default filter workers: 1

    Logstash startup completed

    55.3.244.1 GET /index.html 15824 0.043 #输入这个,下面就会自动形成字典的形式

    {

       "message" => "55.3.244.1 GET /index.html 15824 0.043",
    
      "@version" => "1",
    
    "@timestamp" => "2016-11-13T11:45:47.882Z",
    
          "host" => "elk-node1",
    
        "client" => "55.3.244.1",
    
        "method" => "GET",
    
       "request" => "/index.html",
    
         "bytes" => "15824",
    
      "duration" => "0.043"
    

    }

    其实上面使用的那些变量在程序中都有定义:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    [root@elk-node1 ~]# cd /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.2/patterns/

    [root@elk-node1 patterns]# ls

    aws bro firewalls haproxy junos mcollective mongodb postgresql redis

    bacula exim grok-patterns java linux-syslog mcollective-patterns nagios rails ruby

    [root@elk-node1 patterns]# cat grok-patterns

    filter {

      # drop sleep events
    
    grok {
    
        match => { "message" =>"SELECT SLEEP" }
    
        add_tag => [ "sleep_drop" ]
    
        tag_on_failure => [] # prevent default _grokparsefailure tag on real records
    
      }
    
     if "sleep_drop" in [tags] {
    
        drop {}
    
     }
    
     grok {
    
        match => [ "message", "(?m)^# User@Host: %{USER:user}\[[^\]]+\] @ (?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\s+Id: %{NUMBER:row_id:int}\s*# Query_time: %{NUMBER:query_time:float}\s+Lock_time: %{NUMBER:lock_time:float}\s+Rows_sent: %{NUMBER:rows_sent:int}\s+Rows_examined: %{NUMBER:rows_examined:int}\s*(?:use %{DATA:database};\s*)?SET timestamp=%{NUMBER:timestamp};\s*(?<query>(?<action>\w+)\s+.*)\n#\s*" ]
    
      }
    
      date {
    
        match => [ "timestamp", "UNIX" ]
    
        remove_field => [ "timestamp" ]
    
      }
    

    }

    8)mysql慢查询

    收集文件:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    [root@elk-node1 ~]# cat mysql-slow.conf

    input {

    file {
    
        path => "/root/slow.log"
    
        type => "mysql-slowlog"
    
        codec => multiline {
    
            pattern => "^# User@Host"
    
            negate => true
    
            what => "previous"
    
        }
    
    }
    

    }

    filter {

      # drop sleep events
    
    grok {
    
        match => { "message" =>"SELECT SLEEP" }
    
        add_tag => [ "sleep_drop" ]
    
        tag_on_failure => [] # prevent default _grokparsefailure tag on real records
    
      }
    
     if "sleep_drop" in [tags] {
    
        drop {}
    
     }
    
     grok {
    
        match => [ "message", "(?m)^# User@Host: %{USER:user}\[[^\]]+\] @ (?:(?<clienthost>\S*) )?\[(?:%{IP:clientip})?\]\s+Id: %{NUMBER:row_id:int}\s*# Query_time: %{NUMBER:query_time:float}\s+Lock_time: %{NUMBER:lock_time:float}\s+Rows_sent: %{NUMBER:rows_sent:int}\s+Rows_examined: %{NUMBER:rows_examined:int}\s*(?:use %{DATA:database};\s*)?SET timestamp=%{NUMBER:timestamp};\s*(?<query>(?<action>\w+)\s+.*)\n#\s*" ]
    
      }
    
      date {
    
        match => [ "timestamp", "UNIX" ]
    
        remove_field => [ "timestamp" ]
    
      }
    

    }

    output {

    stdout {
    
       codec =>"rubydebug"
    
    }
    

    }

    执行检测:
    上面需要的/root/slow.log是自己上传的,然后自己插入数据保存后,会显示:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f mysql-slow.conf

    Settings: Default filter workers: 1

    Logstash startup completed

    {

    "@timestamp" => "2016-11-14T06:53:54.100Z",
    
       "message" => "# Time: 161114 11:05:18",
    
      "@version" => "1",
    
          "path" => "/root/slow.log",
    
          "host" => "elk-node1",
    
          "type" => "mysql-slowlog",
    
          "tags" => [
    
        [0] "_grokparsefailure"
    
    ]
    

    }

    {

    "@timestamp" => "2016-11-14T06:53:54.105Z",
    
       "message" => "# User@Host: test[test] @  [124.65.197.154]\n# Query_time: 1.725889  Lock_time: 0.000430 Rows_sent: 0  Rows_examined: 0\nuse test_zh_o2o_db;\nSET timestamp=1479092718;\nSELECT trigger_name, event_manipulation, event_object_table, action_statement, action_timing, DEFINER FROM information_schema.triggers WHERE BINARY event_object_schema='test_zh_o2o_db' AND BINARY event_object_table='customer';\n# Time: 161114 12:10:30",
    
      "@version" => "1",
    
          "tags" => [
    
        [0] "multiline",
    
        [1] "_grokparsefailure"
    
    ],
    
          "path" => "/root/slow.log",
    
          "host" => "elk-node1",
    
          "type" => "mysql-slowlog"
    

    }

    ======================================================================
    接下来描述会遇见到的一个问题:
    一旦我们的elasticsearch出现问题,就不能进行日志采集处理了!
    这种情况下该怎么办呢?

    解决方案;
    可以在client和elasticsearch之间添加一个中间件作为缓存,先将采集到的日志内容写到中间件上,然后再从中间件输入到elasticsearch中。
    这就完美的解决了上述的问题了。

    (4)ELK中使用redis作为中间件,缓存日志采集内容

    1)redis的配置和启动

    [root@elk-node1 ~]# vim /etc/redis.conf #修改下面两行内容
    daemonize yes
    bind 192.168.1.160
    [root@elk-node1 ~]# systemctl start redis
    [root@elk-node1 ~]# lsof -i:6379
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    redis-ser 19474 redis 4u IPv4 1344465 0t0 TCP elk-node1:6379 (LISTEN)
    [root@elk-node1 ~]# redis-cli -h 192.168.1.160
    192.168.1.160:6379> info

    Server

    redis_version:2.8.19

    2)编写从Client端收集数据的文件

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    [root@elk-node1 ~]# vim redis-out.conf

    input {

    stdin {}

    }

    output {

    redis {

      host => "192.168.1.160"
    
      port => "6379"
    
      db => "6"
    
      data_type => "list"
    
      key => "demo"
    

    }

    }

    3)执行收集数据的文件,并输入数据hello redis

    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f redis-out.conf
    Settings: Default filter workers: 1
    Logstash startup completed #下面输入数据hello redis
    hello redis

    4)在redis中查看数据

    [root@elk-node1 ~]# redis-cli -h 192.168.1.160
    192.168.1.160:6379> info

    Server


    Keyspace

    db6:keys=1,expires=0,avg_ttl=0 #在最下面一行,显示是db6
    192.168.1.160:6379> select 6
    OK
    192.168.1.160:6379[6]> keys *

    1. “demo”
      192.168.1.160:6379[6]> LINDEX demo -1
      “{“message”:“hello redis”,”@version":“1”,"@timestamp":“2016-11-14T08:04:25.981Z”,“host”:“elk-node1”}"

    5)继续随便写点数据

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f redis-out.conf

    Settings: Default filter workers: 1

    Logstash startup completed

    hello redis

    123456

    asdf

    ert

    wang

    shi

    bo

    guohuihui

    as

    we

    r

    g

    asdfjkdfsak

    5423wer

    34rt3

    6y

    7uj

    u

    io9

    sdjfhsdk890

    huanqiu

    huanqiuchain

    hqsb

    asda

    6)在redis中查看

    在redis中查看长度:
    [root@elk-node1 ~]# redis-cli -h 192.168.1.160
    192.168.1.160:6379> info

    Server

    redis_version:2.8.19

    Keyspace

    db6:keys=1,expires=0,avg_ttl=0 #显示是db6
    192.168.1.160:6379> select 6
    OK
    192.168.1.160:6379[6]> keys *

    1. “demo”
      192.168.1.160:6379[6]> LLEN demo
      (integer) 24

    7)将redis中的内容写到ES中

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    [root@elk-node1 ~]# vim redis-in.conf

    input {

    redis {
    
      host => "192.168.1.160"
    
      port => "6379"
    
      db => "6"
    
      data_type => "list"
    
      key => "demo"
    

    }

    }

    output {

    elasticsearch {
    
      hosts => ["192.168.1.160:9200"]
    
      index => "redis-in-%{+YYYY.MM.dd}"
    
    }
    

    }

    执行:
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f redis-in.conf --configtest
    Configuration OK
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f redis-in.conf &

    在redis中查看,发现数据已被读出:
    192.168.1.160:6379[6]> LLEN demo
    (integer) 0

    ===温馨提示=

    1

    2

    3

    4

    5

    6

    redis默认只有16个数据库, 也就是说最多只能有16个db, 即db01-db15

    但是key值可以设置不同, 也就是针对不同日志的key前缀可以设置不同.

    比如:

    key => "nginx.log"的值最多可以设置16个db, 即db01-db15

    key => "mysql.log"的值最多可以设置16个db, 即db01-db15

    key => "tomcat.log"的值最多可以设置16个db, 即db01-db15

    登陆elasticsearch界面查看:

    8)接着,将收集到的所有日志写入到redis中。这了重新定义一个添加redis缓存后的总文件shipper.conf。(可以将之前执行的总文件file.conf停掉)

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    [root@elk-node1 ~]# vim shipper.conf

    input {

    file {
    
      path => "/var/log/messages"
    
      type => "system"
    
      start_position => "beginning"
    
    }
    
    
    
    file {
    
       path => "/var/log/elasticsearch/huanqiu.log"
    
       type => "es-error"
    
       start_position => "beginning"
    
       codec => multiline {
    
           pattern => "^\["
    
           negate => true
    
           what => "previous"
    
       }
    
    }
    
    file {
    
       path => "/var/log/nginx/access_json.log"
    
       codec => json
    
       start_position => "beginning"
    
       type => "nginx-log"
    
    }
    
    syslog {
    
        type => "system-syslog"
    
        host => "192.168.1.160"
    
        port => "514"
    
    }
    

    }

    output {

    if [type] == “system”{

     redis {
    
        host => "192.168.1.160"
    
        port => "6379"
    
        db => "6"
    
        data_type => "list"
    
        key => "system"
    
     }
    

    }

    if [type] == "es-error"{
    
      redis {
    
        host => "192.168.1.160"
    
        port => "6379"
    
        db => "6"
    
        data_type => "list"
    
        key => "demo"
    
        }
    
     }
    
    if [type] == "nginx-log"{    
    
       redis {
    
          host => "192.168.1.160"
    
          port => "6379"
    
          db => "6"
    
          data_type => "list"
    
          key => "nginx-log"
    
       }
    
    }
    
    if [type] == "system-syslog"{
    
       redis {
    
          host => "192.168.1.160"
    
          port => "6379"
    
          db => "6"
    
          data_type => "list"
    
          key => "system-syslog"
    
       }    
    
     }
    

    }

    执行上面的文件(提前将上面之前启动的file.conf文件的执行给结束掉!)
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f shipper.conf --configtest
    Configuration OK
    [root@elk-node1 ~]# /opt/logstash/bin/logstash -f shipper.conf
    Settings: Default filter workers: 1
    Logstash startup completed

    在redis中查看:
    [root@elk-node1 ~]# redis-cli -h 192.168.1.160
    192.168.1.160:6379> info

    Server

    redis_version:2.8.19

    Keyspace

    db6:keys=1,expires=0,avg_ttl=0 #显示是db6
    192.168.1.160:6379> select 6
    OK
    192.168.1.160:6379[6]> keys *

    1. “demo”
    2. “system”
      192.168.1.160:6379[6]> keys *
    3. “nginx-log”
    4. “demo”
    5. “system”

    另开一个窗口,添加点日志:
    [root@elk-node1 ~]# logger “12325423”
    [root@elk-node1 ~]# logger “12325423”
    [root@elk-node1 ~]# logger “12325423”
    [root@elk-node1 ~]# logger “12325423”
    [root@elk-node1 ~]# logger “12325423”
    [root@elk-node1 ~]# logger “12325423”

    又会增加日志:
    192.168.1.160:6379[6]> keys *

    1. “system-syslog”
    2. “nginx-log”
    3. “demo”
    4. “system”

    其实可以在任意的一台ES中将数据从redis读取到ES中。
    下面咱们在elk-node2节点,将数据从redis读取到ES中:

    编写文件:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    [root@elk-node2 ~]# cat file.conf

    input {

     redis {
    
        type => "system"
    
        host => "192.168.1.160"
    
        port => "6379"
    
        db => "6"
    
        data_type => "list"
    
        key => "system"
    
     }
    
    
    
      redis {
    
        type => "es-error"
    
        host => "192.168.1.160"
    
        port => "6379"
    
        db => "6"
    
        data_type => "list"
    
        key => "es-error"
    
        }
    
       redis {
    
          type => "nginx-log"
    
          host => "192.168.1.160"
    
          port => "6379"
    
          db => "6"
    
          data_type => "list"
    
          key => "nginx-log"
    
       }
    
       redis {
    
          type => "system-syslog"
    
          host => "192.168.1.160"
    
          port => "6379"
    
          db => "6"
    
          data_type => "list"
    
          key => "system-syslog"
    
       }    
    

    }

    output {

    if [type] == "system"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "system-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    
    
    if [type] == "es-error"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "es-error-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    if [type] == "nginx-log"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "nignx-log-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    if [type] == "system-syslog"{
    
        elasticsearch {
    
           hosts => ["192.168.1.160:9200"]
    
           index => "system-syslog-%{+YYYY.MM.dd}"
    
        }
    
    }
    

    }

    执行:
    [root@elk-node2 ~]# /opt/logstash/bin/logstash -f file.conf --configtest
    Configuration OK
    [root@elk-node2 ~]# /opt/logstash/bin/logstash -f file.conf &

    去redis中检查,发现数据已经被读出到elasticsearch中了。
    192.168.1.160:6379[6]> keys *
    (empty list or set)

    同时登陆logstash和kibana看,发现可以正常收集到日志了。

    可以执行这个 去查看nginx日志
    [root@elk-node1 ~]# ab -n10000 -c1 http://192.168.1.160/

    也可以启动多个redis写到ES中,具体根据自己的实际情况而定。

    logstash配置java环境=
    由于新版的ELK环境要求java1.8,但是有些服务器由于业务代码自身限制只能用java6或java7。
    这种情况下,要安装Logstash,就只能单独配置Logstas自己使用的java环境了。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    操作如下:

    1. 使用rpm包安装logstash

    1)安装java8,参考:http://www.cnblogs.com/kevingrace/p/7607442.html

    2)在/etc/sysconfig/logstash文件结尾添加下面两行内容:

    [root@cx-app01 ~]# vim /etc/sysconfig/logstash

    JAVA_CMD=/usr/local/jdk1.8.0_172/bin

    JAVA_HOME=/usr/local/jdk1.8.0_172

    3)在/opt/logstash/bin/logstash.lib.sh文件添加下面一行内容:

    [root@cx-app02 ~]# vim /opt/logstash/bin/logstash.lib.sh

    export JAVA_HOME=/usr/local/jdk1.8.0_172

    1. 然后使用logstash收集日志,就不会报java环境错误了。

    配置范例=

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    105

    106

    107

    108

    109

    110

    111

    112

    113

    114

    115

    116

    117

    118

    119

    120

    121

    122

    123

    124

    125

    126

    127

    128

    129

    130

    如下的配置范例:

    192.168.10.44为elk的master节点,同时也是redis节点

    [root@client-node01 opt]# pwd

    /opt

    [root@client-node01 opt]# cat redis-in.conf

    input {

    file {
    
       path => "/usr/local/tomcat8/logs/catalina.out"
    
       type => "tomcat8-logs"
    
       start_position => "beginning"
    
       codec => multiline {
    
           pattern => "^\["           //表示收集以"["开头的日志信息
    
           negate => true
    
           what => "previous"
    
       }
    
    }
    

    }

    output {

    if [type] == "tomcat8-logs"{
    
       redis {
    
          host => "192.168.10.44"
    
          port => "6379"
    
          db => "1"
    
          data_type => "list"
    
          key => "tomcat8-logs"
    
       } 
    
     }
    

    }

    [root@client-node01 opt]# cat redis-input.conf

    input {

    file {

        path => "/var/log/messages"
    
        type => "systemlog"
    
        start_position => "beginning"
    
        stat_interval => "2"
    

    }

    }

    output {

    if [type] == “systemlog” {

        redis {
    
                data_type => "list"
    
                host => "192.168.10.44"
    
                db => "2"
    
                port => "6379"
    
                key => "systemlog"
    
        }
    

    }

    }

    [root@client-node01 opt]# cat file.conf

    input {

     redis {
    
        type => "tomcat8-logs"
    
        host => "192.168.10.44"
    
        port => "6379"
    
        db => "1"
    
        data_type => "list"
    
        key => "tomcat8-logs"
    
     }
    
    
    
       redis {
    
          type => "systemlog"
    
          host => "192.168.10.44"
    
          port => "6379"
    
          db => "2"
    
          data_type => "list"
    
          key => "systemlog"
    
       } 
    

    }

    output {

    if [type] == "tomcat8-logs"{
    
        elasticsearch {
    
           hosts => ["192.168.10.44:9200"]
    
           index => "elk-node2-tomcat8-logs-%{+YYYY.MM.dd}"
    
        }
    
    }
    
    
    
    if [type] == "systemlog"{
    
        elasticsearch {
    
           hosts => ["192.168.10.44:9200"]
    
           index => "elk-node2-systemlog-%{+YYYY.MM.dd}"
    
        }
    
    }
    

    }

    [root@client-node01 opt]# /opt/logstash/bin/logstash -f /opt/redis-in.conf --configtest

    Configuration OK

    [root@client-node01 opt]# /opt/logstash/bin/logstash -f /opt/redis-input.conf --configtest

    Configuration OK

    [root@client-node01 opt]# /opt/logstash/bin/logstash -f /opt/file.conf --configtest

    Configuration OK

    启动logstash

    [root@client-node01 opt]# /opt/logstash/bin/logstash -f /opt/redis-in.conf &

    [root@client-node01 opt]# /opt/logstash/bin/logstash -f /opt/redis-input.conf &

    [root@client-node01 opt]# /opt/logstash/bin/logstash -f /opt/file.conf &

    这时候,当/usr/local/tomcat8/logs/catalina.out和/var/log/messages文件里有新日志信息写入时,就会触发动作,

    在redis里就能查看到相关信息,并查看写入到es里。

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

    温馨提示:

    当客户机的日志信息收集后,经过redis刚读到es数据库里后,如果没有新数据写入,则默认在es的访问界面里是看不到

    数据的,只有当日志文件里有新的日志写入后才会触发数据展示的动作,即es的访问界面(http://192.168.10.44:9200/_plugin/head/)

    里才能看到日志数据的展示效果。

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

    假设想上面两个文件里写入测试数据

    [root@client-node01 opt]# echo “hellohellohellohello” >> /var/log/messages

    [root@client-node01 opt]# echo “[hahahahahahhahahahahahahahahahahahah]” >> /usr/local/tomcat8/logs/catalina.out

    到redis里发现有相关的key,很快就会读到es里。可以配置到kibana里观察。

    可以先测试下日志信息是否写到redis里?然后再测试下数据是否从redis读到es里?一步步确定数据去向。

    注意上面redis-in.conf文件中的下面设置,使用正则匹配,收集以哪些字符开头的日志信息:

    pattern => “^[” 表示收集以"["开头的日志信息

    pattern => “^2018” 表示收集以"2018"开头的日志信息

    pattern => “1” 表示收集以字母(大小写)或数字开头的日志信息

    pattern => “[a-zA-Z0-9]|[ ]+” 表示收集以字母(大小写)或数字或空格的日志信息

    你好!
    我看你对ELK这篇博客,写的还不错,我最近也在研究,有一个问题,关于ELK收集mysql慢查询日志,我是用filebeat作为采集端,采集慢查询日志,推送到kafka消息队列,由Logsatsh拉取,logsatsh事件配置中grok正则之后进行输出,中间出了点问题。如果感兴趣的话,请加我QQ,我们在线交流谢谢~
    QQ:1261813048(请标明备注)感谢~

    #15楼 2018-12-08 15:36 | sed_‘s/M18/黑匣子/’

    elk里最难的是filter环节,最重要的插件就是grok,我们线上环境,tomcat多实例启动日志没有用log4j统一日志格式,导致你在用grok匹配的时候非常痛苦,你得兼顾每个日志的格式,否则你的filter结果有n多版本,所以一定要让开发一类应用程序统一日志格式,说说我遇到的问题,问题1 timestamp这绝对是个坑,我发现很多博客就没有说,timestamp这个是logstash 拉取到最新事件的时间,并不是业务日志的访问时间,也就是说你的业务日志每多一条日志,但里面的访问时间如果是昨天的,那么logstash采集到看到的@timestamp不是昨天的而是采集时候的系统时间。问题2 线上很多应用日志一般都是要进行切割的,有些切割工具在切割后,最新日志的文件会变成 catalina-2018-09-08.out,而不是catalina.out 固定的名字,这个需要自己在后台运行一个脚本,检查日志是否切割,如果切割配合软链接指向最新日志,input的时候,这要这个软链接可以了。


    1. a-zA-Z0-9 ↩︎

    展开全文
  • 在2018云栖大会深圳峰会大数据分析与可视化专场上,由阿里巴巴搜索引擎事业部开放搜索团队的吴迪带来了“基于ELK实时日志分析的最佳实践”的主题分享。介绍了传统的日志分析、ELK的概念和ELK实时日志分析的实践。数...

    在2018云栖大会深圳峰会大数据分析与可视化专场上,由阿里巴巴搜索引擎事业部开放搜索团队的吴迪带来了“基于ELK实时日志分析的最佳实践”的主题分享。介绍了传统的日志分析、ELK的概念和ELK实时日志分析的实践。
    数十款阿里云产品限时折扣中赶快点击这里领券开始云上实践吧!
    直播视频回顾
    以下为精彩视频内容整理:

    什么是日志

    首先来说一下日志,日志是属于程序的一部分,在编写程序的时候也就写好了日志。日志的作用是为了排查问题,尤其是突发的问题,一般线上出了问题首先翻日志。日志还可以给我们提供报警监控的功能,通过监控日志的变化,通过日志中可以看出系统出现的问题甚至做出预测。

    传统的日志分析

    通常用Linux中小工具去搜索关键字能得到我们需要用到的信息。这种传统的日志分析的效率是非常低的,尤其是当业务越来越多系统越来越庞大的时候,这时在搜集日志就会变得非常的困难。下面是针对传统日志分析过程中遇到的几点问题:
    1、日志的集中收集与存储:当有上千个节点的时候,日志是分布在许多机器上,如果要获取这些日志的文件,不可能一台一台的去查看,所以这就是很明显的一个问题。
    2、 日志搜索:这种搜索是基于文件的,并且这种效率也会比较低,并不能表达出逻辑上的关系,并不能对系统的全局作出判定。
    3、 分析聚合及可视化:由于日志分布在不同的机器上所以查看起来很困难。
    4、 安全、角色管理:当系统变大后就会有上百个人来查看日志,不同角色不同级别的人看到的是不同的日志而不是所有的人都能看到所有的日志,所以传统的日志可能就会有安全上的问题。
    5、 可伸缩性:当系统越来越大的时候,会产生大量的日志。

    ELK

    现在在开源的生态里面,解决日志收集、搜索、日志聚合和日志分析的一个技术站就是ELK。可能大家已经接触过ELK,但在这里再给大家介绍一下,ELK是Elasticsearch+Logstash+Kibana的缩写。
    Elasticsearch是一套搜索的框架,它的内核是Lucene,它把Lucene这个算法做了封装,提供了很方便使用的接口,以及有非常强大的扩展的能力。用Elasticsearch就可以很快速的做到全文检索的一个服务。
    Logstash也是Elasticsearch公司的一个产品,是用来做数据源的收集,最初它是为了做日志但后来它不光做日志的收集只要是数据都可以用它来收集,它就是一个收集器。
    Kibana可以把它理解为一个UI,但它不是一个简单的UI,通过Kibana可以看到ES上的所有数据,在这上面可以做各种的展示可以做各种图形化的界面。
    这是ELK的一个介绍。因为ELK在开源的搜索领域是非常的火热,只要提到搜索都会想到Elasticsearch,提到数据的搜集就会想到Logstash,所以现在这套组件都成了标配了。

    阿里云Elasticsearch生态

    _1


    这是一个阿里云的Elasticsearch生态,所有的这些组件都是基于阿里云的。可以看到这个Beats和Logstash是平行的,它俩的作用基本类似。和阿里云合作最重要的一点就是X-Pack,X-Pack提供了很多强大的功能,比如说Security就能解决前边的一些问题,不同级别的人可以看到不同的字段。数据本身也可以得到一个保护,安全也基本上可以放心。再介绍一下Alerting,如果用户在世界的多个地方登录了可以通过Alerting这个功能报警出来,可以做一个预警,因为这种行为可能是被黑客入侵。Monitoring是为了监控整个Elasticsearch技术站的组件。Graph可以分析出在Elasticsearch上所有的数据之间的关系,来帮我们更好的组织数据。Reporting是可以通过对数据的一些计算,能够分析出数据的变化,然后通过Reporting的机制告诉我们这些数据的变化。MachineLearning是在把数据导入Elasticsearch以后通过MachineLearning以后能够通过统计学上的一些计算能够分析出Graph一段时间的数据,甚至可以预测出未来变化的走向。所有的这一切都是建立在阿里云上面的。

    数据安全

    _2


    右边这个大的虚线框是VPC网络,用户的数据和Elasticsearch的数据站都是在VPC里面,接触阿里云的ECS、VPC可能都知道它对于用户来说就是一个封闭的网络,外面进不去里面出不来,除非用户授权。右侧是用户的应用服务,用户的搜索都是在用户的VPC里面。中间是公网服务,通过有密码的保护,黑白名单的限制来保护服务暴露在公网上的安全性。Logstash可以把语音服务器、云数据库和云存储的数据都是可以导入到VPC里面的ES服务,用户这边可以使用到ES的数据。这样一来就可以保护用户的数据不被泄露。

    Logstash架构

    _3


    Logstash这个架构非常简单,Input就是我能对接各种数据源,比如数据库、OSS等都可以对接。Filter做一些数据的处理,处理完了以后输出,输出可以输出到ES也可以输出到别的系统。所以Date Source通过Logstash输出到Date Destination。

    通过Kibana搜索日志

    把日志导入到ES这个技术站里面之后,其实就是通过ES解决了日志聚合的问题,可以散布在各个机器上的日志收集到一块,通过ES聚合在一起,通过Kibana就可以很方便的去搜索日志。

    通过ES API定制搜索条件

    通过API去搜索日志库,通过Kibana可以直接写查询的条件,这个是非常的方便的。

    阿里云Elasticsearch性能

    刚刚说了Elasticsearch的特性,我们在回来说一下Elasticsearch在阿里云上的一些性能。

    _4


    我们做了一个Elasticsearch的压测主要是5.5.3版本的,分别在2核4G、4核16G、16核64G的上做了一个压测。使用的是官方的压测工具,没有改任何的参数,都是默认的参数。可以看到这条绿色的线是官方的geonames3.3GB,单doc311B,在16和64G的时候可以达到每秒14万doc。后来做了更进一步的压测就是说多线程的时候它的性能会更好。这个比市面上的同类软件是要高很多的。

    业务架构

    _5


    当需要搭建ELK的时候业务架构是什么样的。先看一下Beats,Beats是可以和业务部署在一起。Beats可以直接到Elasticsearch也可以直接到Logstash,Beats和Logstash的整合应用是现在比较流行的。整体的架构来看Logstash和Elasticsearch一般会分开部署,因为Logstash属于CPU密集型的组件,Elasticsearch属于I/O密集型的组件,所以在部署的时候会把两者分开。

    实践

    基于机器学习的日志分析

    _6


    机器学习可以对日志进行分析,这个虚线分析出这段时间内的一个趋势,然后分析所有日志的时候就会发现数据不太对的时候就可以通过Reporting来反馈给我们,并且还可以预测出趋势。

    ELK监控告警

    ELK监控报警是对ELK技术栈的一个报警,是对索引、节点的一个监控。我们致力于把搜索事业部一些很强大的功能通过阿里云这个平台向外输出,其实这个特性就是我们技术沉淀的一个输出,它会自动的分析整个ES的健康状况。然后把ELK的架构做一个自动的优化。

    本文由云栖志愿小组陈欢整理编辑

    展开全文
  • elk实时日志分析平台部署搭建详细实现过程
                   




    1、ELK平台介绍

     在搜索ELK资料的时候,发现这篇文章比较好,于是摘抄一小段:以下内容来自: http://baidu.blog.51cto.com/71938/1676798

     日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。


     通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。 


     集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。


     开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。官方网站: https://www.elastic.co/product

    E:\u\elk\pic\01_1.png


     

     


    2、安装准备

               

    Elk平台环境

    系统

    版本

    服务器操作系统

    Centos release 6.7 (Final)

    ElasticSearch

    2.3.4

    Logstash

    2.3.4

    Kibana

    4.5.3

    Jdk

    1.8

     

    注:由于Logstash的运行依赖于Java环境,Logstash1.5以上版本不低于java 1.7,因此推荐使用最新版本的Java。因为我们只需要Java的运行环境,所以可以只安装JRE,不过这里我依然使用JDK,请自行搜索安装,我这里准备使用1.7



     

     

    3、下载

    官方网址:https://www.elastic.co/downloads,如下图所示:E:\u\elk\pic\01_2.png


     

    从中获得下载地址:

    wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.3.4/elasticsearch-2.3.4.tar.gz

     

    wget https://download.elastic.co/logstash/logstash/logstash-2.3.4.tar.gz

     

    wget https://download.elastic.co/kibana/kibana/kibana-4.5.3-linux-x64.tar.gz

     

    wget http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.tar.gz 

     


    4、安装调试

    4.1、安装jdk

    使用root安装jdk

    mkdir -p /usr/lib/jvm

     

    tar -xvf   jdk-8u45-linux-x64.tar.gz -C /usr/lib/jvm

     

     

     

    # vim /etc/profile 配置系统参数
      export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_45
      export JRE_HOME=${JAVA_HOME}/jre
      export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
      export PATH=${JAVA_HOME}/bin:$PATH

     

     

     

    sudo update-alternatives --install  /usr/bin/java java /usr/lib/jvm/jdk1.8.0_45/bin/java 300

     

    sudo update-alternatives --install  /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_45/bin/javac 300

     

     

    4.2、安装elasticsearch

    使用elk账号安装elasticearch:

    # 解压缩安装

     

    useradd elk

     

    su - elk

     

    tar -xvf elasticsearch-2.3.4.tar.gz

     

    cd elasticsearch-2.3.4

     

     

     

    # 安装Head插件

     

    ./bin/plugin install  mobz/elasticsearch-head

     

    ls plugins/

     

     

     

    # ls能看到head文件即可表示ok了。

     

    [elk@hch_test_dbm1_121_62  elasticsearch-2.3.4]$ ll plugins/

     

    总用量 4

     

    drwxrwxr-x.  5 elk elk 4096 8月   2 17:26 head

     

    [elk@hch_test_dbm1_121_62  elasticsearch-2.3.4]$

     

     

     

    编译es的配置文件:

    cluster.name: es_cluster

     

    node.name: node0

     

     

     

    path.data: /home/elk/data

     

    path.logs: /home/elk/logs

     

    # 当前的host ip地址

     

    network.host: 192.168.121.62

     

    network.port: 9200

     

    启动es:

    ./bin/elasticsearch &

     

     

    看后台日志,发现它和其它的节点的传输端口为9300,而接受HTTP请求的端口为9200。日志如下所示:

    [elk@hch_test_dbm1_121_62  elasticsearch-2.3.4]$ more ../logs/es_cluster.log

     

    [2016-08-02 17:47:23,285][WARN  ][bootstrap                ] unable to  install syscall filter: seccomp unavailable: requires kernel 3.5+ with  CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled

     

    in

     

    [2016-08-02 17:47:23,579][INFO  ][node                     ] [node0]  version[2.3.4], pid[21176], build[e455fd0/2016-06-30T11:24:31Z]

     

    [2016-08-02 17:47:23,586][INFO  ][node                     ] [node0]  initializing ...

     

    [2016-08-02 17:47:24,213][INFO  ][plugins                  ] [node0]  modules [reindex, lang-expression, lang-groovy], plugins [head], sites [head]

     

    [2016-08-02 17:47:24,235][INFO ][env                      ] [node0] using [1]  data paths, mounts [[/home (/dev/mapper/vg_dbmlslave1-lv_home)]], net  usable_space [542.1gb], net total_space [10

     

    17.2gb], spins? [possibly], types [ext4]

     

    [2016-08-02 17:47:24,235][INFO ][env                      ] [node0] heap size  [989.8mb], compressed ordinary object pointers [true]

     

    [2016-08-02 17:47:24,235][WARN ][env                      ] [node0] max file  descriptors [4096] for elasticsearch process likely too low, consider  increasing to at least [65536]

     

    [2016-08-02 17:47:25,828][INFO  ][node                     ] [node0]  initialized

     

    [2016-08-02 17:47:25,828][INFO  ][node                     ] [node0]  starting ...

     

    [2016-08-02 17:47:25,939][INFO  ][transport                ] [node0]  publish_address {192.168.121.62:9300}, bound_addresses {192.168.121.62:9300}

     

    [2016-08-02 17:47:25,944][INFO  ][discovery                ] [node0]  es_cluster/626_Pu5sQzy96m7P0EaU4g

     

    [2016-08-02 17:47:29,028][INFO  ][cluster.service          ] [node0]  new_master  {node0}{626_Pu5sQzy96m7P0EaU4g}{192.168.121.62}{192.168.121.62:9300}, reason:  zen-disco-join(elected_as_master,

     

    [0] joins received)

     

    [2016-08-02 17:47:29,116][INFO  ][http                     ] [node0]  publish_address {192.168.121.62:9200}, bound_addresses {192.168.121.62:9200}

     

    [2016-08-02 17:47:29,117][INFO  ][node                     ] [node0]  started

     

    [2016-08-02 17:47:29,149][INFO  ][gateway                  ] [node0]  recovered [0] indices into cluster_state

     

    [elk@hch_test_dbm1_121_62  elasticsearch-2.3.4]$

     

     

    打开url地址http://192.168.121.62:9200/,E:\u\elk\pic\01_3.png

     



    看返回结果,有配置的cluster_name、节点name信息以及安装的软件版本信息,其中安装的head插件,它是一个用浏览器跟ES集群交互的插件,可以查看集群状态、集群的doc内容、执行搜索和普通的Rest请求等。可以使用web界面来操作查看http://192.168.121.62:9200/_plugin/head/,如下图E:\u\elk\pic\01_4.png:

     

    可以从界面看到,当前的elas集群里面没有index也没有type,所以是空记录。

     


    4.3、安装logstash

    logstash其实它就是一个 收集器 而已,我们需要为它指定InputOutput(当然InputOutput可以为多个)。由于我们需要把Java代码中Log4j的日志输出到ElasticSearch中,因此这里的Input就是Log4j,而Output就是ElasticSearch

    结构图如E:\u\elk\pic\02.png所示:

     

     

    安装配置:

    # 解压缩安装

     

    tar -xvf logstash-2.3.4.tar.gz

     

    cd logstash-2.3.4

     

     

     

    # 将配置文件放置在config文件夹下面

     

    mkdir config

     

    vim config/log4j_to_es.conf

     

    # For detail structure of this  file

     

    # Set:  https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html

     

    input {

     

      # For detail config for log4j as input,

     

      # See:  https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html

     

      log4j {

     

        mode => "server"

     

        host => "192.168.121.62"

     

        port => 4567

     

      }

     

    }

     

    filter {

     

      #Only matched data are send to output.

     

    }

     

    output {

     

      # For detail config for elasticsearch as  output,

     

      # See:  https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html

     

      elasticsearch {

     

        action => "index"          #The operation on ES

     

        hosts   => "192.168.121.62:9200"    #ElasticSearch host, can be array.

     

        index   => "applog"          #The index to write data to.

     

      }

     

    }

     

     

    启动logstash,2个参数一个是agent一个是配置文件:

    [elk@hch_test_dbm1_121_62  logstash-2.3.4]$ ./bin/logstash agent -f config/log4j_to_es.conf

     

    Settings: Default pipeline workers: 32

     

    log4j:WARN No appenders could be found  for logger (org.apache.http.client.protocol.RequestAuthCache).

     

    log4j:WARN Please initialize the log4j  system properly.

     

    log4j:WARN See  http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

     

    Pipeline main started

     

    接下来,可以使用logstash来收集日志并保存到es中了,可以使用一段java代码来实现它。

     

    4.4elk3测试工程

    工程环境是eclipse,工程大概目录结构如下图E:\u\elk\pic\04.png,一个java类Application.java,一个日志配置文件log4j.properties,一个调度配置文件pom.xml:

     

     

    1Application.java

    package com.demo.elk;

     

    import org.apache.log4j.Logger;

     

    public class Application {

     

          private static final Logger LOGGER = Logger.getLogger(Application.class);

     

          public Application() {

     

               // TODO Auto-generated constructor stub

     

          }

     

          public static void main(String[] args) {

     

               // TODO Auto-generated method stub

     

            for (int i = 0; i < 10; i++) {

     

                LOGGER.error("Info log [" + i + "].");

     

                try {

     

                          Thread.sleep(500);

     

                     }  catch (InterruptedException e) {

     

                          // TODO Auto-generated catch blockl

     

                          e.printStackTrace();

     

                     }

     

            }

     

          }

     

    }

     

     

    2Pom.xml:

    <project xmlns="http://maven.apache.org/POM/4.0.0"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  http://maven.apache.org/xsd/maven-4.0.0.xsd">

     

      <modelVersion>4.0.0</modelVersion>

     

      <groupId>elk3</groupId>

     

      <artifactId>elk3</artifactId>

     

      <version>0.0.1-SNAPSHOT</version>

     

      <name>elk3</name>

     

      <dependency>

     

        <groupId>log4j</groupId>

     

        <artifactId>log4j</artifactId>

     

        <version>1.2.17</version>

     

    </dependency>

     

    </project>

     

     

    3 log4j.properties

    Log4j.properties,将Log4j的日志输出到 SocketAppender ,因为官网是这么说的E:\u\elk\pic\01_5.png:

     

     

    Log4j.properties文件:

    log4j.rootLogger=INFO,console

     

     

     

    #  for package com.demo.elk, log would be sent to socket appender.

     

    log4j.logger.com.demo.elk=DEBUG,  socket

     

     

     

    #  appender socket

     

    log4j.appender.socket=org.apache.log4j.net.SocketAppender

     

    log4j.appender.socket.Port=4567

     

    log4j.appender.socket.RemoteHost=192.168.121.62

     

    log4j.appender.socket.layout=org.apache.log4j.PatternLayout

     

    log4j.appender.socket.layout.ConversionPattern=%d  [%-5p] [%l] %m%n

     

    log4j.appender.socket.ReconnectionDelay=10000

     

     

     

    #  appender console

     

    log4j.appender.console=org.apache.log4j.ConsoleAppender

     

    log4j.appender.console.target=System.out

     

    log4j.appender.console.layout=org.apache.log4j.PatternLayout

     

    log4j.appender.console.layout.ConversionPattern=%d  [%-5p] [%l] %m%n

     

     

    注意:这里的端口号需要跟Logstash监听的端口号一致,这里是4567。

     


    4.5eclipse调试结果

    1eclipse查看调试结果

    在eclipse里面允许java程序,查看console的输出信息(这个output只是为了做一验证,没有这一步不输出到console也是可以的),调试成功后输出结果如下图E:\u\elk\pic\05.png所示:

     

     

    2)去Elasticsearchhead界面查看效果

    去界面http://192.168.121.62:9200/_plugin/head/查看效果,点击概览里面,看到下面绿色的就是primay分片,下面灰色的为非primay备份分片,如下图E:\u\elk\pic\06.png所示:

     

    其中:

    A:docs: 20(20) 表示一共有20个文档,一个文档一个日志记录;

    B:node0  表示只有一个分片,5个备份,分片暂时没有地方存放,所以显示为灰色Unassigned状态;

    C:es_cluster集群健康值: yellow (6 of 12)表示因为有的分片没有地方存放所以集群报出了警告的黄色字体信息;

     

     

    3)去Elasticsearchbrower界面查看效果

    E:\u\elk\pic\07.png

     

    其中索引中的.kibana applog:表示是生成的索引集群,kibana暂时是空的,没有记录不遍历查询,而applog5个分片记录。

    查询 6 个分片中用的 5 个. 30 命中. 耗时 0.054 秒 表示:看到6个分片,其中有5个是applog,有30个是执行了3次eclipse所产生的log记录次数。

     

     

    4)查看单个文档_index信息

    在选择中的单个文档,点击左键,就会弹出单个文档的全部信息,除了message是我们的日志内容,其它都是logstash增加的内容信息,新增加的这些字段信息涵义可以参考官网:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html的描述,如下图E:\u\elk\pic\08.png所示

     

     

    PS总结:上面列出的都是单个EShead界面组件查看到的elas集群的数据和状态,只是一个简单的和elas的交互界面,并不能形成报表或者动态的图表,所以我们需要其它的专业工具来做搜索并生成图表。         

     

     

    4.6、安装kinana

    # 解压缩安装

     

    tar -xvf kibana-4.5.3-linux-x64.tar.gz

     

    cd kibana-4.5.3-linux-x64

     

     

     

    # 配置   修改配置

     

    vim config/kibana.yml  server.port: 5601

     

    server.host: "192.168.121.62"

     

    elasticsearch.url:  “http://192.168.121.62:9200

     

    kibana.index: ".kibana"

     

     

     

    # 启动kibana

     

    ./bin/kibana

     

    [elk@hch_test_dbm1_121_62  kibana-4.5.3-linux-x64]$ ./bin/kibana

     

      log    [14:53:15.975] [info][status][plugin:kibana] Status changed from  uninitialized to green - Ready

     

      log    [14:53:16.021] [info][status][plugin:elasticsearch] Status changed  from uninitialized to yellow - Waiting for Elasticsearch

     

      log    [14:53:16.036] [info][status][plugin:kbn_vislib_vis_types] Status  changed from uninitialized to green - Ready

     

      log    [14:53:16.046] [info][status][plugin:markdown_vis] Status changed from  uninitialized to green - Ready

     

      log    [14:53:16.052] [info][status][plugin:metric_vis] Status changed from  uninitialized to green - Ready

     

      log    [14:53:16.064] [info][status][plugin:spyModes] Status changed from  uninitialized to green - Ready

     

      log    [14:53:16.068] [info][status][plugin:statusPage] Status changed from  uninitialized to green - Ready

     

      log    [14:53:16.072] [info][status][plugin:elasticsearch] Status changed  from yellow to green - Kibana index ready

     

      log    [14:53:16.075] [info][status][plugin:table_vis] Status changed from  uninitialized to green - Ready

     

      log    [14:53:16.084] [info][listening] Server running at  http://192.168.121.62:5601

     

    ./bin/kibana

     

     

     

    之后打开界面http://192.168.121.62:5601/status  如下,E:\u\elk\pic\03.png:

     

     

    4.7、配置kibana

    为了后续使用Kibana,需要配置至少一个Index名字或者Pattern,它用于在分析时确定ES中的Index。这里我输入之前配置的Index名字applog,Kibana会自动加载该Index下doc的field,并自动选择合适的field用于图标中的时间字段:

    再打开http://192.168.121.62:5601/app/kibana,输入applog,会自动弹出如下界面,然后点击“create”按钮保存下,如下图E:\u\elk\pic\09.png所示:

     

    创建完成后,自动弹出成功界面,如下图E:\u\elk\pic\10.png所示:

     

     

    4.8kibana生成图表

    选择左上角的“Discover”,然后再选择右上角的“List 15 minutes”(如果右上角默认的时间查询没有数据,就需要手动调整查询时间了),如下图E:\u\elk\pic\12.png所示:

     

     

    这里为了看到数据信息,所以保守的选择了“Today”,然后会看到今天的记录,也即是看到的elas中的数据记录了,如下图E:\u\elk\pic\13.png所示:

     


    在输入框里面,输入info字样,点击搜索按钮搜索,可以看到搜索匹配的信息如下E:\u\elk\pic\14.png:

     

     

     

    点击右上角的“Save Search”按钮,就会保存此次的search结果,如下图E:\u\elk\pic\16.png所示:

     

     

     

    接下来去Visualize页面,点击新建一个柱状图(Vertical Bar Chart),然后选择刚刚保存的查询search_logs_save_1,如下图E:\u\elk\pic\17.png所示:

     

     

     

    之后进入左边选择x轴为Date Histogram时间轴,显示为时分,间隔为Auto自动间隔,然后点击绿色的三角形按钮“Apply Changes”,kibana将生成类似于下图的柱状图,如下图E:\u\elk\pic\18.png所示:

     

     

     

    然后点击右边的保存按钮“Save Visualization”,可以保存此图为search_log_visual_1,如下图E:\u\elk\pic\19.png所示:

     

     

    然后进入“Dashboard”界面,点击下面的灰色背景的“+”按钮,如下图E:\u\elk\pic\20.png所示:



    然后选择我们刚才保存的visual图,就会展示出来上次我们生成的图表记录,面板上就会显示出原来的图表,如下图E:\u\elk\pic\21.png所示:

     

     

    如果有较多数据,我们可以根据业务需求和关注点在Dashboard页面添加多个图表:柱形图,折线图,地图,饼图等等。当然,我们可以设置更新频率,让图表自动更新,如下图E:\u\elk\pic\22.png所示:


     

    当然如果设置的时间比较紧凑,比较短暂的话,其实就相当于实时分析的图表了,类似于zabbix的监控图了。

     

    OK,最基本的elk平台部署和调试的流程就走完了,接下来就是各种业务场景的使用了。

     

     

     

    5、一些错误记录

    (1)start 问题

    [elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$  ./bin/elasticsearch &

     

    [1] 20726

     

    [elk@hch_test_dbm1_121_62  elasticsearch-2.3.4]$ Exception in thread "main"  SettingsException[Failed to load settings from [elasticsearch.yml]]; nested:  ElasticsearchParseException[malformed, expected settings to start with  'object', instead was [VALUE_STRING]];

     

    Likely root cause:  ElasticsearchParseException[malformed, expected settings to start with  'object', instead was [VALUE_STRING]]

     

             at  org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:65)

     

             at  org.elasticsearch.common.settings.loader.XContentSettingsLoader.load(XContentSettingsLoader.java:45)

     

             at  org.elasticsearch.common.settings.loader.YamlSettingsLoader.load(YamlSettingsLoader.java:46)

     

             at  org.elasticsearch.common.settings.Settings$Builder.loadFromStream(Settings.java:1080)

     

             at  org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:1067)

     

             at  org.elasticsearch.node.internal.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:88)

     

             at  org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:107)

     

             at  org.elasticsearch.common.cli.CliTool.<init>(CliTool.java:100)

     

             at  org.elasticsearch.bootstrap.BootstrapCLIParser.<init>(BootstrapCLIParser.java:48)

     

             at  org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:226)

     

             at  org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)

     

    Refer to the log for complete error  details.

     

     

     

    [1]+   Exit 1                   ./bin/elasticsearch

     

    [elk@hch_test_dbm1_121_62 elasticsearch-2.3.4]$

     

    原因是:配置文件中的=要换成:

    [elk@hch_test_dbm1_121_62  elasticsearch-2.3.4]$ more config/elasticsearch.yml  |grep -v "#"

     

    cluster.name: es_cluster

     

    node.name: node0

     

     

     

    path.data: /home/elk/data

     

    path.logs: /home/elk/logs

     

    network.host: 192.168.121.62

     

    network.port: 9200

     

    [elk@hch_test_dbm1_121_62  elasticsearch-2.3.4]$

     

     

    (2)、Unable to fetch mapping.

    Unable to fetch mapping. Do you haveindices matching the pattern?

     

    这就说明logstash没有把日志写入到elasticsearch。

    解决方法:

    检查logstash与elasticsearch之间的通讯是否有问题,一般问题就在这。

     

     

    (3)、log4j报错

    log4j:WARN No appenders could be foundfor logger (com.demo.elk.Application).

    log4j:WARN Please initialize the log4jsystem properly.

    log4j:WARN Seehttp://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

    解决:

    (a)      jdk版本比较低,需要jdk1.7以上

    (b)java类和log4j.properties没有匹配上,在测试中需要将java类和log4j.properties放在一个目录上。

     

    重要参考文档:http://www.tuicool.com/articles/YR7RRr

     

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • 来自:武培轩本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢?ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logs...

    来自:武培轩

    本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢?

    ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。

    • Elasticsearch 是一个搜索和分析引擎

    • Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等存储库中。

    • Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化

    ELK Stack

    Elasticsearch 的核心是搜索引擎,所以用户开始将其用于日志用例,并希望能够轻松地对日志进行采集和可视化。有鉴于此,Elastic 引入了强大的采集管道 Logstash 和灵活的可视化工具 Kibana。

    ELK日志系统数据流图如下:

    ELK日志系统数据流图

    简短了解 ELK 是个啥后,让我们一起动手搭建 ELK 实时日志分析平台,首先安装 Elasticsearch。

    注:ELK 环境搭建版本很关键,建议统一版本,避免错误无处下手,我在这里选用的是 7.1.0 版本。

    ElasticSearch 介绍与安装

    ElasticSearch 的介绍与安装在上一篇文章已经讲过了,这里就不进行赘述了,大家可以点击下方链接查看:

    全文搜索引擎 Elasticsearch 入门:集群搭建

    如果你已经了解并安装好 Elasticsearch,那么就跟着我一起往下一步进发:了解并安装 Kibana。

    Kibana 介绍与安装

    这部分主要讲解如何下载并安装 Kibana,以及如何安装 Kibana 插件,同时会针对 Kibana 的界面进行简单的介绍。

    首先让我们来看下 Kibana 究竟是何物?

    什么是 Kibana?

    Kibana 是为 Elasticsearch 设计的开源分析和可视化平台,你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互,你可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。

    在简单了解了 Kibana 后,让我们来到 Kibana 的下载网站 https://www.elastic.co/cn/downloads/kibana ,目前使用的是 Windows 系统,因此下载 Windows 版本的 Kibana 下载包 kibana-7.1.0-windows-x86_64.zip

    运行 Kibana

    下载完成后在本地解压,如果需要对 Kibana 做一些定制,可以在 config 目录下 编辑 kibana.yml 文件,在运行 Kibana 之前需要先运行 ElasticSearch(以下简称 ES),因为 Kibana 是基于 ES 运行的,现在进入 bin 目录下打开 kibana.bat 就可以运行 Kibana 了,我们现在打开浏览器,Kibana 是运行在 5601 端口上的,因此打开 http://localhost:5601,打开后会出现如下页面:

    导入样例数据,查看 Dashboard

    进入首页后会提示我们可以添加一些测试数据,ES 在 Kibana 开箱即用的版本中,已经为我们准备了三种样例数据,电商网站的订单,航空公司的飞行记录以及 WEB 网站的日志,我们可以点击 Add data,把他们添加进来,添加完成后,我们可以打开 Dashboards 界面,就可以看到系统已经为我们创建了数据的 Dashboard。

    Dashboards

    第一个是电商的利润报表,我们可以打开来看一下:

    在 Dashboard 中,我们可以将多套可视结果整合至单一页面内,而后提供搜索查询或者点击可视结果内的某元素指定过滤条件,从而实现结果过滤,Dashboard 能够帮助我们更全面地了解总体日志内容,并将各可视结果同日志关联起来,以上就是 Kibana 的 Dashboard 功能。

    Dev Tools

    接下来介绍 Kibana 里面非常有用的工具 Dev Tools,其实就是可以很方便地在 Kibana 中执行 ES 中的一些 API,比如我们上文讲到的检测有哪些节点在运行:GET /_cat/nodes?v,这样我们就能在 Kibana 中运行 ES 命令了。

    另外,Kibana 的 Dev Tools 还有许多的快捷菜单操作,比如 Ctrl + / 可以查看 API 帮助文档,其他的大家可以去自行摸索。

    安装与查看插件

    Kibana 可以通过插件的方式来提供一些 Kibana 中的特定应用或者增强图表展示的功能,Kibana 安装插件和 ES 非常相似。

    输入 kibana-plugin install kibana-plugin install https://github.com/sivasamyk/logtrail/releases/download/v0.1.31/logtrail-7.1.0-0.1.31.zip 就可以下载 LogTrail 插件了。

    在 cmd 中输入 kibana-plugin list 可以查看本机已安装的 Kibana 插件。

    如果想移除插件可以使用 kibana-plugin remove logtrail 命令来进行移除插件。

    到此为止,我们就下载并安装完成 Kibana,并对 Kibana 主要功能进行简单介绍,还介绍了 Dev Tools,大家可以自己在本地进行实践操作下。

    目前就差 ELK 三兄弟的最后一个:Logstash,让我们一起学习下。

    Logstash 介绍与安装

    这部分主要是下载并安装 Logstash,并通过 Logstash 将测试数据集导入到 ES 中。

    话不多说,首先让我们来了解下 Logstash 是个啥?

    什么是 Logstash?

    Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的存储库中。

    Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构,从 IP 地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。

    数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择 ,可以在同一时间从众多常用来源捕捉事件,能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。

    再了解过后,让我们去下载安装 Logstash。

    安装 Logstash

    还是来到 Logstash 的官网,进入到下载页面 https://www.elastic.co/cn/downloads/logstash,下载的时候注意要和 ES 和 Kibana 的版本相同,这里下载的为 7.1.0 版本 logstash-7.1.0.zip

    下载后进行解压,也可以进入 conf 目录下修改 logstash.conf 进行配置,运行的时候可以通过指定配置文件 logstash -f logstash.conf 就可以执行数据的插入和转换的工作。

    再安装完成之后,让我们来使用 Logstash 往 ES 中导入数据。

    用 Logstash 导入 ES

    下面我们来导入测试数据集,首先修改 logstash.conf 文件,内容为:

    input {
      file {
        path => ["D:/SoftWare/logstash-7.1.0/csv/movies.csv"]
        start_position => "beginning"
        sincedb_path => "D:/SoftWare/logstash-7.1.0/csv/null"
      }
    }
    filter {
      csv {
        separator => ","
        columns => ["id","content","genre"]
      }
    
    
      mutate {
        split => { "genre" => "|" }
        remove_field => ["path", "host","@timestamp","message"]
      }
    
    
      mutate {
    
    
        split => ["content", "("]
        add_field => { "title" => "%{[content][0]}"}
        add_field => { "year" => "%{[content][1]}"}
      }
    
    
      mutate {
        convert => {
          "year" => "integer"
        }
        strip => ["title"]
        remove_field => ["path", "host","@timestamp","message","content"]
      }
    
    
    }
    output {
       elasticsearch {
         hosts => "http://localhost:9200"
         index => "movies"
         document_id => "%{id}"
       }
      stdout {}
    }
    
    
    

    测试数据集来自 Movielens :https://grouplens.org/datasets/movielens/,大家可以前往下载。配置文件中的 path 根据自己下载的测试文件路径去修改。另外,配置文件的逻辑将在以后的文章中进行讲解。

    现在来执行命令 logstash -f logstash.conf 来把数据导入 ES。当看到数据打印到控制台时,数据也正在被写入 ES 中。

    到此为止,我们就成功安装了 Logstash,并通过 Logstash 将测试数据集写入 ES,同时我们的 ELK 实时日志分析平台就搭建完成了。

    补充

    在通过 Logstash 将测试数据集写入 ES 后,小伙伴会发现 movies 索引状态为 yellow,不用担心,yellow 代表有副本分片没有被分配。

    因为只在本机之启动了一个节点,而 movies 的索引设置了一个主分片一个副本分片,主副分片是无法分配在一个节点上的。

    解决方法:修改索引 setting,将副本 replica 设置成 0,或者为集群增加一个节点,状态就会变为 green。

    总结

    本文主要了解了什么是 ELK,然后通过实际操作和大家一起搭建了一个 ELK 日志分析平台,如果在搭建过程中有什么问题,欢迎留言交流讨论。

    参考文献

    https://www.elastic.co/guide/en/kibana/7.1/index.html

    https://www.elastic.co/guide/en/logstash/7.1/index.html

    Elasticsearch核心技术与实战


           

    特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:
    
    长按订阅更多精彩▼
    
    如有收获,点个在看,诚挚感谢
    
    展开全文
  • Elk实时日志分析平台搭建

    千次阅读 2016-10-27 23:10:20
    一、 关于ELK实时日志分析平台 A. Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 B. Logstash是一个...
  • ELK实时日志分析系统的Beats平台的简单介绍。
  • ELK 实时日志平台搭建并在 Spring Boot 和 Nginx 项目中使用 目录: ELK简介 ELK的工作原理 Elasticsearch Logstash Kibana Spring Boot 中使用 ELK Nginx 中使用 ELK 一. ELK简介 ELK 是一个开源的实时日志分析...
  • ELK实时日志分析平台环境部署--完整记录   在日常运维工作中,对于系统和业务日志的处理尤为重要。今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明...
  • ELK实时日志分析平台环境部署--完整记录 在日常运维工作中,对于系统和业务日志的处理尤为重要。今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例...
  • ELK 实时日志分析

    2019-10-08 14:57:46
    http://www.cnblogs.com/yjf512/p/4199105.html http://www.tuicool.com/articles/QFvARfr 缓存可以使用Kafka MQ 转载于:https://www.cnblogs.com/TendToBigData/p/10501388.html...
  • ELK实时日志分析平台

    2017-01-10 23:23:32
    今天,在这里分享一下自己部署的ELK(+Redis)-开源实时日志分析平台的记录过程(仅依据本人的实际操作为例说明,如有误述,敬请指出)~ 一、概念介绍 日志主要包括系统日志、应用程序日志和安全日志。系统运维...
  • ELK实时日志分部署

    2018-08-23 20:53:18
    ELK简介 “ELK”是三个开源项目的首字母缩写:Elasticsearch,Logstash和Kibana。Elasticsearch是一个搜索和分析引擎。Logstash是一个服务器端数据处理管道,它同时从多个源中提取数据,对其进行转换,然后将其发送...
  • ELK 实时日志分析平台环境搭建

    千次阅读 2017-12-26 22:35:49
    简单介绍ELK(ElasticSearch, Logstash, Kibana),三者组合在一起搭建实时日志分析平台,目前好多公司都是这套! - Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分...
  • ELK是一套完整的日志分析解决方案,由ElasticSearch、Logstash、Kibana这三款开源软件组成。Elasticstash是基于Lucene开发的分布式存储检索引擎,用来存储各类日志;Logstash对日志进行收集、分析,并将其存储供以后...
  • https://blog.csdn.net/yy756127197/article/details/78873310 基本的上的过程如这篇博客,logback的配置文件和依赖不太一样 具体见源码其中的zipkin模块 source code :... ...
  • ELK实时日志分析概述

    2018-11-06 15:34:41
    对于任何系统来说日志都是及其重要的组成部分。但是由于现在的计算机系统大多比较复杂,很多系统都不是在一个地方,甚至都是跨国界的;即使是在一个地方的系统,也有不同的来源,比如,操作系统,应用服务,业务逻辑...
  • 一、elk简介开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成:ElasticSearch是一个基于Lucene的开源分布式搜索服务器。它的特点有:分布式,零配置,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,377
精华内容 550
关键字:

elk实时日志