zoukankan      html  css  js  c++  java
  • ELK的搭建以及使用

    一、架构如图:

    二、工作机制:

         在需要收集日志的应用上安装filebeat(需要修改配置文件,配置文件稍后介绍),启动filebeat后,会收集该应用的日志推送给redis,然后logstash从redis中收集日志推送到Elasticsearch。

         因Elasticsearch是一个集群,所以只需要在某台Elasticsearc安装一个Kibana提供给用户一个可视化界面即可。

         而在学习Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据。如果都是通过rest请求,未免太过麻烦,而且也不够人性化,所以需要安装一个head插件。同上,只需要在某台Elasticsearc安装一个head插件,提供给运维查看数据状态即可。

        

    三、 安装准备

    1、 安装包

    通过https://www.elastic.co/downloads,可以下载es所有需要的安装包,可自行根据需要下载对应版本。

    并且将包都解压到/opt/platform

    以下是目前es使用到的安装包:

    Elasticsearch5.2.X

    安装方法:

    修改配置文件:vim /opt/platform/elasticsearch/config/elasticsearch.yml

    配置详见文件下文。

    启动ela: ./bin/elasticsearch

     

    Filebeat5.2.X

    安装方法:

    创建目录:mkdir conf

    复制配置文件:cp filebeat.yml /conf

    修改配置文件:vim /opt/platform/filebeat/conf/filebeat.yml

    配置详见文件下文。

    启动filebeat: ./filebeat -c conf/filebeat.yml &

     

    Logstash5.2.X

    安装方法:

    创建目录:mkdir conf

    配置文件:vim /opt/platform/filebeat/conf/ filebeat-java-to-es.conf

    配置详见文件下文。

    启动logstash:/opt/platform/logstash/bin/logstash -f /opt/platform/logstash/conf/filebeat-java-to-es.conf &

     

    Es-head5.2.x

    安装方法:

    Github下载源码:git clone git://github.com/mobz/elasticsearch-head.git

    cd elasticsearch-head

    安装node依赖模块:npm install

    ln -s /opt/platform/es-head/node_modules/grunt/bin/grunt grunt

    启动es head插件的独立服务:nohup grunt server &

    或者nohup npm run start &

    配置文件:

    vim Gruntfile.js

    port按需更改,默认9100

     

    Kibana5.2.X

    安装方法:

    修改配置文件:vim /opt/platform/kibana/config/kibana.yml

    配置文件修改内容如下:

    server.port: 5601

    server.host: "x.x.x.x"

    elasticsearch.url: http://x.x.x.x:9200

     

    Redis3.2.8(常规安装,不做介绍了)

    Jdk1.8.0_121(常规安装,不做介绍了)

     

    2、 端口开放:

    redis+logstash

    63799600

    redis+logstash

    63799600

    redis+logstash

    63799600

    es+kibana

    920093005601

    es+head

    910092009300

    Es

    92009300

     

    3、依赖包

    elsticserch依赖于java1.8以上版本,需要安装JDK1.8+,同样logstash也需要依赖jdk,所以也需要安装。

     

    四、配置文件:

    1、Elasticserch

            1、elasticserch 启动时需要设置vm.max_map_count和允许打开的最大文件描述符数量

            (1)、修改vm.max_map_count

                        vi /etc/sysctl.conf
                         增加以下内容
                           vm.max_map_count=262144

            (2)、修改允许打开的最大文件描述符数量

    vim /etc/security/limits.d/10-nproc.conf 
    *       soft    nproc   20480
    *       hard    nproc   20480
    root    soft    nproc   unlimited
    root    hard    nproc   unlimited
    *       soft    nofile  1048576
    *       hard    nofile  1048576
    ops	soft	memlock	unlimited
    ops	hard	memlock	unlimited
    

      

             (3)、修改elstic的配置文件,以下是比较重要的参数;

          PS: 需要在elasticsearch的配置文件中加入以下内容,这样head才能连接到elasticsearch查看集群状态:

           thread_pool.search.queue_size: 10000

           http.cors.enabled: true

           http.cors.allow-origin: "*"

    2、Filebeat配置文件

    #prospectors config

    filebeat.prospectors:

    - input_type: log

      paths:

        - /opt/platform/quarkloan-api-app/logs/convertor/convertorinfo.log

        - /opt/platform/quarkloan-api-app/logs/convertor/convertorerror.log

      encoding: plain

      document_type: loanapi

      multiline.pattern: ^[0-9]

      multiline.negate: true

      multiline.match: after

    #global config

    filebeat.registry_file: ${path.data}/registry-loanapi

    #output.redis config

    output.redis:

      hosts: ["10.19.64.69:6379", "10.19.64.70:6379", "10.19.64.71:6379"]

      key: filebeat-java

      datatype: list

      loadbalance: true

    3、Logstash配置文件

    input {

        redis {

            data_type => "list"  #value type is STRING

            key => "filebeat-java"  #value type is STRING

            host => "10.19.64.69"  #value type is STRING

            port => 6379  #value type is NUMBER,Default value is 6379

        }

        redis {

            data_type => "list"

            key => "filebeat-java"

            host => "10.19.64.70"

            port => 6379

        }

        redis {

            data_type => "list"

            key => "filebeat-java"

            host => "10.19.64.71"

            port => 6379

        }

    }

    filter {

        #JAVA日志解析,时间 线程 级别 类 ,日志实际内容不解析

        grok {

            match => {

                "message" => "%{TIMESTAMP_ISO8601:timestamp}s+%{DATA:thread}s+%{DATA:level}s+%{DATA:class}s+"

            }

        }

        #用日志输出时间替换掉ES的@timestamp

        date {

            match => ["timestamp", "ISO8601"]

            target => "@timestamp"

        }

        #节流过滤,打节流tag,output.email根据tag判断是否发送ERROR日志邮件

        if [type] == "loanapi" and [level] == "ERROR" {

           throttle {

               period => 600

               max_age => 1200

               before_count => 4

               key => "%{type}%{level}"

               add_tag => "throttled"

           }

        }

    }

    output {

        elasticsearch {

        hosts => ["10.19.64.72:9200", "10.19.64.105:9200", "10.19.64.106:9200"]  #value type is ARRAY

        index => "%{type}-%{+YYYY.MM.dd}"  #YYYY.MM.dd get from @timestamp field

        flush_size => 2000  #value type is NUMBER,Default value is 500

        idle_flush_time => 5  #value type is NUMBER,Default value is 1

        }

        #按type,level,tags判断是否发送ERROR日志邮件(此项为特殊要求,不建议用logstash进行日志发送,避免影响logstash的性能)

        if [type] == "loanapi" and [level]== "ERROR" and "throttled" in [tags] {

           email {

               port => 465

               address => "mail.xxx.com"

               from => "logerror@xxx.com"

               username => "xxxr"

               password => "xxx"

               authentication => "login"

               contenttype => "text/plain; charset=UTF-8"

               use_tls => true

               subject => "ELK异常邮件:[%{[beat][hostname]}服务器]-[%{type}日志异常]"

               to => "sss@qqq.com"

               via => "smtp"

               body => "%{message}"

           }

        }

    }

    五 、启动kibana

    当加入了新的日志到ELK中时,可以在management中新建index,如下图

    日志格式要求

    目前线下java应用的日志输出组件有两个,logback和log4j,格式应满足如下要求,以便于接入生产ELK,方便开发能快速查看生产日志。
    日志输出标准有如下建议请参考

    1、请尽量使用log4j
    2、日志文件编码格式:UTF-8,请不要使用默认
    3、日志文件rotate:按天,单文件容量不超过50MB
    4、日志输出的时间格式使用ISO8601(如yyyy-MM-dd HH:mm:ss.SSS),%d或%date默认输出格式为ISO8601
    5、日志输出的字段分隔符使用tab,替换空格
    6、日志输出字段顺序:date  thread  level  class  message
    7、日志输出Pattern建议如下:
    8、Logback组件pattern:%date    [%thread]    %-5level    [%logger]    -    %msg%n
    9、Log4j组件pattern:%d    [%t]    %-5p    [%c]    -    %m%n
    10、日志路径微服务日志路径为/opt/jarapp/logs  tomcat日志路径为/opt/tomcat/logs
  • 相关阅读:
    第36课 经典问题解析三
    第35课 函数对象分析
    67. Add Binary
    66. Plus One
    58. Length of Last Word
    53. Maximum Subarray
    38. Count and Say
    35. Search Insert Position
    28. Implement strStr()
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/cjsblogs/p/8021577.html
Copyright © 2011-2022 走看看