• 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
  • 相关阅读:
    自定义指令directive
    angular中的表单验证
    ng-init,ng-controller,ng-model
    Redis执行lua脚本,key不存在的返回值
    消息队列对比
    数据库设计范式
    网络IO模型
    .NET 线程、线程池
    异步和多线程
    Memcache知识点
  • 原文地址:https://www.cnblogs.com/cjsblogs/p/8021577.html
Copyright © 2020-2023  润新知