zoukankan      html  css  js  c++  java
  • 日志收集系统搭建-BELK

    前言

        日志是我们分析系统运行情况、问题定位、优化分析等主要数据源头。目前,主流的业务系统都采用了分布式、微服务的形式。如果想要查看日志,就需要从不同的节点上去查看,而且对于整个业务链路也非常不清晰。因此,我们首先引入日志收集框架,将分布在各个节点的日志统一汇总到一处。方便日志查询、分析与问题定位。

        根据我们目前的技术栈,我们的服务是在spring cloud下搭建的。因而使用spring sleuth搭建日志收集是快而便捷的。个人使用spring sleuth + kafka +zipkin + mysql,搭建起一个系统间的trace日志追踪系统。该套框架的优势在于,使用简单(只要引入自己封装好的starter,指定kafka及zookeeper地址即可)。spring sleuth会自动拦截http请求,并分配统一trace id来追踪这一次的请求全链路。最后,通过zipkin的可视化页面,我们能非常方便的看出一次请求的整个链路,而且能直观的看出各个系统的耗时,对于性能分析比较有帮助。但是,相较于本文要说的ELK日志系统而言,spring sleuth还是有几个明显的缺点的:

        1. spring sleuth只会获取过滤到的http请求信息,对于收集系统打印的业务日志信息较麻烦,可定制化相较于ELK太差。(这也是选择ELK的主要原因)

        2. spring sleuth的日志生成、收集、生产、消费,都共同消耗服务资源。

        反观ELK,有两种选择,即可以嵌入到系统(使用log4j的socket发送日志到ELK),也可以独立存在(logstash直接读取日志文件)。而且,对于日志文件中内容的获取,有更灵活的配置(基于logstash的filter插件)。So, it's ELK!

        最后再说一点,说了这么多,应该都知道ELK指的是elasticsearch+logstash+kibana。对于logstash,如果你的server所在的机器上,资源比较紧张,那么可以选择elastic家族中的Filebeat来做server日志的收集工作。这也正是官方所推荐的(The Filebeat client is a lightweight, resource-friendly tool that collects logs from files on the server and forwards these logs to your Logstash instance for processing. Filebeat is designed for reliability and low latency. Filebeat has a light resource footprint on the host machine, and the Beats input plugin minimizes the resource demands on the Logstash instance.)。我们日志系统的搭建也是使用了Filebeat来收集日志,统一汇总到日志系统的logstash,然后再由logstash将日志信息推送到elasticsearch。在此,暂且叫BELK。用一个图来形象的表述一下关系:

    1. 环境准备

        首先,我们需要准备日志系统需要的环境。

        1. JRE需要1.8+。

        2. ES等需要创建文件限制提升到65536+;虚拟内存区域最大数量262144+。

    bash
    vi /etc/security/limits.conf
    # 添加下面内容
    test - nofile 65536  # test为操作账号
    vi /etc/sysctl.conf
    # 添加下面内容
    vm.max_map_count=262144
    # 保存并生效
    sysctl -p

    2. 安装elasticsearch

        1. 到官网下载压缩包。本例使用的是6.2.2版本。elasticsearch-6.2.2.zip。

        2. 解压:unzip elasticsearch-6.2.2.zip -d /sinochem/software/elasticsearch-6.2.2

        3. 配置文件修改。配置文件在解压目录中的./config下的elasticsearch.yml文件。需要我们修改的项为:

             

    elasticsearch.yml
    cluster.name: es-application # 集群名字
     
    node.name: node-1 # 当前节点名字
     
    path.data: /sinochem/software/elasticsearch-6.2.2/data # es数据存放路径
     
    path.logs: /sinochem/software/elasticsearch-6.2.2/logs # es日志路径
     
    network.host: 10.144.132.70 # 当前节点IP地址
     
    http.port: 9200 # 监听端口号

        4. 启动服务。nohup ./bin/elasticsearch >/dev/null & 

        注:目前ES只是单机模式,后续升级支持集群模式。

    3. 安装Kibana    

        1. 到官网下载压缩包。本例使用的是6.2.2版本。kibana-6.2.2-linux-x86_64.tar.gz。

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

        3. 配置文件修改。配置文件在解压目录中的./config下的kibana.yml文件。需要我们修改的项为:

             

    kibana.yml
    server.port: 5601 # 服务端口
     
    server.host: "10.xxx.xxx.xxx" # 服务IP地址
     
    kibana.index: ".kibana" # kibana在es中的索引

     

        4. 启动服务。nohup ./bin/kibana >/dev/null &

    4. 安装Logstash

        1. 到官网下载压缩包。本例使用的是6.2.2版本。logstash-6.2.2.tar.gz。

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

        3. 配置文件修改。配置文件在解压目录中的./config下新增日志配置文件logstash.conf。文件内容为:

             

    logstash.conf
    input {
        # beat插件,监听5044端口
        beats {
            port => "5044"
        }
    }
    filter {
        grok {
            match => [ "message", "%{COMBINEDAPACHELOG}" ]
        }
        date {
            match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ]
        }
    }
    output {
        # 日志输出到ES
        elasticsearch {
            hosts => ["10.xxx.xxx.xxx:9200"]
            index => "logstash-%{+YYYY.MM.dd}"
        }
    }

     

        4. 启动服务。nohup ./bin/logstash -f config/logstash.conf --config.reload.automatic >/dev/null &

        5. 日志匹配。

            COMBINEDAPACHELOG基本能满足日志收集需求,如果你想要更加精确的收集自己需要的日志。可以定义自己的正则表达式。grok插件中,自带了一些默认表达式,可以通过https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns 中列举的查看并使用。当然,你也可以直接使用正则表达式。如果想定义自己的,可以在./config(个人喜好)下,创建自己的正则表达式文件,取名patterns(可随意)。在文件里定义自己的表达式:

    patterns
    # 自定义正则
    MILLISECOND [0-9]{3}
    DATA2END [sS]*
    SINOCHEM_TIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:%{MINUTE}:%{SECOND}.%{MILLISECOND}

        然后,就可以在上边创建的logstash.conf中使用了,详细配置如下:

    input {
        # file {
        #     path => "/letv/message-bus-ilive/logs/chat_gate.log"
        #     type => "producer"
        #     start_position => "beginning"
        #     codec => json
        # }
        beats {
            port => "5044"
        }
    }
    filter {
        grok {
            # 此处指定自定义的patterns的路径
            patterns_dir => ["./config/patterns"]
            match => {
                # 此处就可以使用自定义的变量了
                "message" => ["%{COMBINEDAPACHELOG}","%{SINOCHEM_TIME:time}%{SPACE}%{DATA:thread}%{SPACE}%{LOGLEVEL:loglevel}%{SPACE}[%{DATA:class}]%{SPACE}[%{DATA:traceId},%{DATA:spanId}]%{SPACE}-%{SPACE}%{DATA2END:message}"]
            }
            # 重写message内容
            overwrite => ["message"]
            remove_field => ["beat"]
        }
    }
    output {
        elasticsearch {
            hosts => ["10.144.132.70:9200"]
            index => "logstash-%{+YYYY.MM.dd}"
        }
    }

        其中SINOCHEM_TIME、DATA2END就是我们在patterns文件中自定义的变量。

    5. 安装Filebeat

        以上几个都是安装在ELK系统体系下的,Filebeat需要安装到各个服务所在机器上。Filebeat使用的是6.3.0版本,使用该版本是为了使用其中的processors。当然以上也可以使用6.3.X版本。

        1. 到官网下载压缩包。filebeat-6.3.0-linux-x86_64.tar.gz。

        2. 解压:tar -zxvf filebeat-6.3.0-linux-x86_64.tar.gz

        3. 配置文件修改。配置文件在解压目录中的./config下的filebeat.yml文件。简单配置如下:

    filebeat.yml
    filebeat.inputs:
    # 用户自定义部分 start
    - type: log
      paths:
        # 日志文件
        - /sinochem/app/cooperation/monitor-gateway/logs/*-info.log
      exclude_lines: ['^DBG']
      fields:
        # 服务名称
        app_name: monitor-gateway
      fields_under_root: true
     
    - type: log
      paths:
        - /sinochem/app/cooperation/monitor-admin-service/logs/*-info.log
      exclude_lines: ['^DBG']
      fields:
        app_name: monitor-admin-service
      fields_under_root: true
    # 用户自定义部分 end
     
    output.logstash:
      hosts: ["10.xxx.xxx.xxx:5044"]
     
    fields:
      # 需要用户设置环境变量,或者直接将本机IP替换变量
      ip_address: "${IP_ADDRESS:UNKNOWN}"
    fields_under_root: true
     
    processors:
    - drop_fields:
      fields: ["host"]
    # - add_host_metadata: ~
    # - decode_json_fields:
    #      fields: ["host"]
     
    filebeat.shutdown_timeout: 5s

        4. 启动服务。nohup ./bin/filebeat -e -c config/filebeat.yml -d publish >/dev/null &

    6. 定时清理索引

        ES中的日志索引增速是可预见的,用太大的存储空间来存储日志信息是不明智的。所以,可根据实际情况,给予一个清理日志的经验值。由于我们建立logstash的日志索引是按照日期建立的,我们在这里可以只留15天的日志信息。清理ES索引,使用了elasticsearch-curator。安装配置脚本如下:

    curator_install.sh
    sudo -i
    # public signing key
    rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
    # edit yum install info
    echo '[curator-5]
    name=CentOS/RHEL 7 repository for Elasticsearch Curator 5.x packages
    baseurl=https://packages.elastic.co/curator/5/centos/7
    gpgcheck=1
    gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    ' > /etc/yum.repos.d/curator.repo
    # install
    yum install elasticsearch-curator
    cd /opt/elasticsearch-curator
    mkdir config
    mkdir log
    echo "actions:
      1:
        action: delete_indices
        description: >-
          Delete indices older than 15 days for logstash-
        options:
          ignore_empty_list: True
          # disable_action: True
        filters:
        - filtertype: pattern
          kind: prefix
          value: logstash-
        - filtertype: age
          source: name
          direction: older
          timestring: '%Y.%m.%d'
          unit: days
          unit_count: 15" > /opt/elasticsearch-curator/config/action.yml
    echo "client:
      hosts:
        - 10.144.132.70:9200
      # port: 9200
      url_prefix:
      use_ssl: False
      certificate:
      client_cert:
      client_key:
      ssl_no_validate: False
      http_auth:
      timeout: 50
      master_only: False
    logging:
      loglevel: DEBUG
      logfile: '/opt/elasticsearch-curator/log/curator.log'
      logformat: default
      blacklist: ['elasticsearch''urllib3']" > /opt/elasticsearch-curator/config/config.yml

        安装完后,配置crontab。

    crontab.sh
    crontab -e

        追加如下一行:

    crontab
    10 1 * * * curator --config /opt/elasticsearch-curator/config/config.yml /opt/elasticsearch-curator/config/action.yml

    后记

        至此,基础版本的BELK系统已经搭建完成。我们可以在浏览器中输入:http://10.xxx.xxx.xxx:5601/ 访问ES的可视化界面。如下图所示,日志信息已经汇总到了ES中。

        目前版本只是雏形,其中还有一些功能需要完善。例如:ES集群的搭建、ES索引、ES历史数据的处理等。ELK搭建也是初次接触,存在使用与认知错误是不可避免的,在此欢迎各位童鞋当面或留言指正,以上。

  • 相关阅读:
    java设计模式之单例模式总结
    分页功能实现
    java设计模式之代理模式模式总结
    java设计模式之策略模式总结
    快速排序解决相关问题
    单例模式之恶汉模式(详解)
    java多线程之内存的可见性介绍(备用1)
    Robotframework(4):创建变量的类型和使用
    Robotframework(3):使用pycharm编写和运行RF脚本
    Robotframework(2):创建RF第一条可执行的用例
  • 原文地址:https://www.cnblogs.com/code-juggler/p/9264114.html
Copyright © 2011-2022 走看看