• 单机部署ELK + Filebeat 收集应用日志



    前言

    单机部署ELK + Filebeat 收集应用日志。


    一、ELK是什么?

    ELK 是一个开源的数据分析和日志管理解决方案,全称为 Elasticsearch, Logstash, Kibana。ELK Stack 主要用于收集、管理和分析日志数据,帮助用户理解和洞察大型数据集。以下是各个组件的功能概述:

    • Elasticsearch:这是一个基于 Lucene 的全文搜索引擎和分布式索引引擎,用于存储、管理和搜索大量数据。它提供了一个用于查询和分析数据的 RESTful API,并利用其强大的搜索和分析功能,帮助用户处理和理解大规模数据集。
    • Logstash:这是一个强大的数据处理工具,用于实时地收集、解析、过滤和转换日志数据。Logstash 可以从各种源收集数据,包括文件、网络流、数据库、API 调用等,并通过一系列插件进行过滤、转换和格式化,以便更容易地处理和分析数据。
    • Kibana:这是一个用于管理和可视化 Elasticsearch 数据的 Web 界面。Kibana 提供了几种方式来查看和探索数据,包括可视化图表、地图、时间序列图和搜索功能。它可以帮助用户快速提取洞察,提供了数据探索、分析和报告的界面。

    Filebeat 是 Elastic Stack(ELK)中的一个组件,用于轻量级的日志文件收集和转发。它能够实时监控指定的日志文件,并将其发送到 Elasticsearch 或 Logstash 进行处理和分析。

    ELK和Filebeat的关系

    二、系统环境(CentOS 7)(2C4G的机器。。。)

    cat /etc/os-release
    

    在这里插入图片描述

    cat /etc/centos-release
    

    在这里插入图片描述

    三、安装步骤

    • ElasticSearch 下载地址 https://www.elastic.co/cn/downloads/elasticsearch
    • Kibana 下载地址 https://www.elastic.co/cn/downloads/kibana
    • Logstash 下载地址 https://www.elastic.co/cn/downloads/logstash
    • Filebeat 下载地址 https://www.elastic.co/cn/downloads/beats/filebeat

    在这里插入图片描述
    安装的方式很多,这里提供的是下载包的方式,上传到服务器里,解压改配置再后台启动。

    3.1 安装ElasticSearch

    ElasticSearch 8.0以上,和其他低版本最大的区别就是,默认开启安全防护。kibana访问时需要token访问。
    首次启动Elasticsearch时,默认情况下会启用并配置安全功能。以下安全配置将自动进行:
    启用身份验证和授权,并为弹性内置超级用户生成密码。
    为传输层和HTTP层生成TLS的证书和密钥,并使用这些密钥和证书启用和配置TLS。
    为Kibana生成一个注册令牌,有效期为30分钟。

    开发文档: https://www.elastic.co/guide/en/elasticsearch/reference/8.14/index.html

    3.1.1 解压到/usr/local

    tar -zxvf elasticsearch-8.14.3-linux-x86_64.tar.gz -C /usr/local
    

    3.1.2 修改jvm堆配置(可选,测试服务器内存低)

    vim /usr/local/elasticsearch-8.14.3/config/jvm.options
    

    修改配置

    -Xms512m
    -Xmx512m
    

    3.1.3 修改elasticsearch.yml

    vim /usr/local/elasticsearch-8.14.3/config/elasticsearch.yml
    

    修改配置

    # 集群名称
    cluster.name: my-application
    # 节点名称
    node.name: node-1
    # 指定访问主机 设置成0.0.0.0可以被任何机器访问
    network.host: 0.0.0.0
    http.port: 9200
    discovery.seed_hosts: ["127.0.0.1"]
    cluster.initial_master_nodes: ["node-1"]
    
    # 关闭安全配置(这里为了后面配置少些,安全性低)
    xpack.security.enabled: false
    xpack.security.enrollment.enabled: false
    # Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
    xpack.security.http.ssl:
      enabled: false
    # Enable encryption and mutual authentication between cluster nodes
    xpack.security.transport.ssl:
      enabled: false
    

    3.1.4 创建es用户

    不可使用root用户直接启动elasticsearch,需要创建一个用户来启动ES。

    java.lang.RuntimeException: can not run elasticsearch as root
            at org.elasticsearch.bootstrap.Elasticsearch.initializeNatives(Elasticsearch.java:286) ~[elasticsearch-8.14.3.jar:?]
            at org.elasticsearch.bootstrap.Elasticsearch.initPhase2(Elasticsearch.java:169) ~[elasticsearch-8.14.3.jar:?]
            at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:74) ~[elasticsearch-8.14.3.jar:?]
    
    # 创建用户es
    groupadd es
    useradd -g es es
    passwd es
    

    3.1.5 赋予es操作权限

    chown -R es:es /usr/local/elasticsearch-8.14.3/
    

    3.1.6 万事俱备

    cd /usr/local/elasticsearch-8.14.3/bin/
    
    # 切换es用户
    su es
    # 启动(第一次建议这个,可以看看输出)
    ./elasticsearch
    # 后台启动
    nohup ./elasticsearch &
    # 不需要nohup.out文件 执行命令
    nohup ./elasticsearch > /dev/null 2>&1 &
    
    # 查看启动的进程
    ps -ef | grep elasticsearch
    

    在这里插入图片描述

    3.1.7 启动问题清单

    bootstrap check failure [1] of [1]: 
    max virtual memory areas vm.max_map_count [65530] is too low, 
    increase to at least [262144];
    
    # 切换到root用户:
    su root
    
    sysctl -w vm.max_map_count=262144
    
    # 查看结果:
    sysctl -a|grep vm.max_map_count
    
    # 切换用户,再次启动
    su es
    # 进入到bin目录,启动命令
    ./elasticsearch
    

    目前就碰到这问题,待大家补充。

    3.1.8 启动成功

    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    ✅ Elasticsearch security features have been automatically configured!
    ✅ Authentication is enabled and cluster connections are encrypted.
    
    ℹ️  Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
      Q1dedsRMdwW3TlCurM6S
    
    ℹ️  HTTP CA certificate SHA-256 fingerprint:
      a760b450bc408134a581a7dae6f10c934d12f03490464bbe6bf03f1f8a29f1ee
    
    ℹ️  Configure Kibana to use this cluster:
    • Run Kibana and click the configuration link in the terminal when Kibana starts.
    • Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes):
      eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTAuMC4xMi4yOjkyMDAiXSwiZmdyIjoiYTc2MGI0NTBiYzQwODEzNGE1ODFhN2RhZTZmMTBjOTM0ZDEyZjAzNDkwNDY0YmJlNmJmMDNmMWY4YTI5ZjFlZSIsImtleSI6IkQxVm1CcEVCUUoyYWhtcGZFQjFHOnBRSFg3YTU3VDlXQXVTTUZDYlp3UncifQ==
    
    ℹ️ Configure other nodes to join this cluster:
    • Copy the following enrollment token and start new Elasticsearch nodes with `bin/elasticsearch --enrollment-token <token>` (valid for the next 30 minutes):
      eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTAuMC4xMi4yOjkyMDAiXSwiZmdyIjoiYTc2MGI0NTBiYzQwODEzNGE1ODFhN2RhZTZmMTBjOTM0ZDEyZjAzNDkwNDY0YmJlNmJmMDNmMWY4YTI5ZjFlZSIsImtleSI6IkRWVm1CcEVCUUoyYWhtcGZFQjA4Onl2ODNUM29VVEhXcWhXNi1Ub3BjYncifQ==
    
      If you're running in Docker, copy the enrollment token and run:
      `docker run -e "ENROLLMENT_TOKEN=" docker.elastic.co/elasticsearch/elasticsearch:8.14.3`
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    

    查看ElasticSearch是否启动成功。

    curl 127.0.0.1:9200
    
    {
      "name" : "node-1",
      "cluster_name" : "my-application",
      "cluster_uuid" : "VlzgSvECRRqg8iFbmzB1Tw",
      "version" : {
        "number" : "8.14.3",
        "build_flavor" : "default",
        "build_type" : "tar",
        "build_hash" : "d55f984299e0e88dee72ebd8255f7ff130859ad0",
        "build_date" : "2024-07-07T22:04:49.882652950Z",
        "build_snapshot" : false,
        "lucene_version" : "9.10.0",
        "minimum_wire_compatibility_version" : "7.17.0",
        "minimum_index_compatibility_version" : "7.0.0"
      },
      "tagline" : "You Know, for Search"
    }
    

    3.2 安装Kibana

    3.2.1 解压到/usr/local,并赋予用户es权限

    tar -zxvf kibana-8.14.3-linux-x86_64.tar.gz -C /usr/local
    
    chown -R es:es /usr/local/kibana-8.14.3/
    

    3.2.2 修改kibana.yml配置

    vim /usr/local/kibana-8.14.3/config/kibana.yml
    
    server.port: 5601
    server.host: "0.0.0.0"
    elasticsearch.hosts: ["http://localhost:9200"]
    

    3.2.3 关闭ssl配置

    vim /usr/local/kibana-8.14.3/config/node.options
    
    # 注释掉
    ## --openssl-legacy-provider
    

    3.2.4 使用es用户启动

    # kibana也不能使用root启动
    su es
    
    nohup ./kibana &
    
    # 1、启动时的进程号可以直接kill命令停止
    

    在这里插入图片描述

    # 2、或者使用,找到进程号再kill
    ps aux | grep /src/cli/dist 
    

    在这里插入图片描述

    3.2.5 启动成功、测试

    在这里插入图片描述

    3.3 Logstash安装

    官方文档:https://www.elastic.co/guide/en/logstash/current/first-event.html

    Logstash提供了一个灵活的数据处理平台,可以用于过滤、解析、聚合、转换数据,并且支持多种插件来实现复杂的处理逻辑。这包括但不限于时间戳解析、用户自定义的脚本、日志格式转换、字段重命名等。

    原理:
    Logstash 事件处理管道有三个阶段:输入 → 过滤器 → 输出。

    在这里插入图片描述

    3.3.1 解压到/usr/local

    tar -zxvf logstash-8.14.3-linux-x86_64.tar.gz -C /usr/local
    

    3.3.2 测试配置

    配置测试文件:进入logstash-8.14.3文件夹下进行配置

    vim /usr/local/logstash-8.14.3/config/privacy_phone.logstash.conf
    
    # logstash配置文件: privacy_phone.logstash.conf
    input {
      stdin {
        id => "stdin_input"
      }
    }
    
    filter {
      grok {
        match => { "message" => "(?\d{11})" }
      }
    
      if [phone_number] {
        mutate {
          add_field => { "masked_phone_number" => "%{phone_number}" }
        }
        ruby {
          code => "
            event.set('masked_phone_number', event.get('masked_phone_number').gsub(/(\d{3})\d{4}(\d{4})/, '\\1****\\2'))
          "
        }
        mutate {
          remove_field => ["phone_number"]
        }
      }
    }
    #输出到ElasticSearch
    output {
      elasticsearch {
        hosts => ["http://127.0.0.1:9200"]
        # 推送到 ElasticSearch的哪个索引
        index => "testphone-%{+YYYY.MM.dd}"
        #user => "elastic"
        #password => "changeme"
      }
    }
    
    #输出到控制台
    #output {
    #  stdout {
    #    codec => rubydebug
    #  }
    #}
    
    #进入bin目录执行
    ./logstash -f /usr/local/logstash-8.14.3/config/privacy_phone.logstash.conf
    

    启动成功后,输入文本。

    在这里插入图片描述

    进入kibana : http://ip地址:5601/

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    这块例子有点生硬,但主旨就是logstash是可以处理数据的。
    【开发文档写的很详细,无非就是数据输入,经过过滤器处理,再输出数据的流程】

    3.3.3 多应用如何推送

    vim /usr/local/logstash-8.14.3/config/multiple.logstash.conf
    
    input {
      beats {
        port => 5044
      }
    }
    
    output {
      if [fields][appname] == "app1" {
        elasticsearch {
          hosts => ["localhost:9200"]
          index => "app1-%{+YYYY.MM.dd}"
        }
      }
    }
    
    input {
      beats {
        port => 5045
      }
    }
    
    output {
      if [fields][appname] == "app2" {
        elasticsearch {
          hosts => ["localhost:9200"]
          index => "app2-%{+YYYY.MM.dd}"
        }
      }
    }
    
    #进入bin目录执行
    nohup ./logstash -f /usr/local/logstash-8.14.3/config/multiple.logstash.conf & 
    

    3.3.3 关闭logstash

    ps -ef|grep logstash
    
    kill 进程号
    

    3.3.4 错误收集

    org.jruby.exceptions.SystemExit: (SystemExit) exit
    

    在这里插入图片描述
    提示找不到文件、修改路径即可。

    3.4 Filebeat安装

    3.4.1 解压(后续在各服务器下安装,把对应日志推送到logstash或者直接推给ES即可)

    tar -zxvf filebeat-8.14.3-linux-x86_64.tar.gz
    
    # 进入文件夹
    cd filebeat-8.14.3-linux-x86_64
    

    3.4.2 新增测试配置

    # 新增app1_filebeat.yml
    vim app1_filebeat.yml
    
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /opt/elk/logs1/*.log
      fields:
        appname: app1 # 标志
    
    output.logstash:
      hosts: ["127.0.0.1:5044"]
    
    # 按配置文件启动
    nohup ./filebeat -e -c app1_filebeat.yml &
    
    # 模拟日志生成
    mkdir /opt/elk/logs1/
    
    cd /opt/elk/logs1/
    
    vim info.2024-08-02.log
    
    # 插入以下数据模拟正常日志
    我是日志文件11111111111111111111111111111啊
    

    filebeat控制台输出。
    在这里插入图片描述

    在这里插入图片描述
    kibana再对应创建下就能看见数据了。

    (app2也一样,filebeat复制一份改下配置,appname:改成app2,filebeat推到logstash就会被推到对应的index)

    3.4.3 关闭Filebeat

    ps -ef | grep filebeat
    
    kill 进程号
    

    3.4.4 收尾工作

    关于java的一些错误日志,按以上配置收集到es中时,因为是逐行收集,看着就难以排查问题,例如

    [2024-08-02 09:16:00.305] [xxl-job, executor ExecutorRegistryThread] ERROR c.x.job.core.util.XxlJobRemotingUtil : Connection refused (Connection refused)
    java.net.ConnectException: Connection refused (Connection refused)
    	at java.net.PlainSocketImpl.socketConnect(Native Method)
    	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    	at java.net.Socket.connect(Socket.java:607)
    	at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    	at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    	at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    	at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    	at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    	at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    	at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    	at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    	at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    	at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    	at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:99)
    	at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:42)
    	at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    	at java.lang.Thread.run(Thread.java:748)
    

    在kibana中显示为:
    在这里插入图片描述

    修改filebeat配置

    vim app1_filebeat.yml
    
    filebeat.inputs:
    - input_type: log
      enabled: true
      paths:           
        - /opt/elk/logs1/*.log
      encoding: utf-8
      fields: 
        appname: app1 # logstash可以用此字段判断
      multiline:
        pattern: '^\d{4}-\d{1,2}-\d{1,2}' # 匹配以 YYYY-MM-DD 开头的行 
        negate: true # 是否匹配 pattern 的情况
        match: after # 将其追加到上一行之后 pattern + negate + match 组合成一条语意为: 如果匹配 YYYY-MM-DD HH:mm:ss 开头的行,则将其合并到当前行的上一行
        max_lines: 200 # 最多匹配多少行,如果超出最大行数,则丢弃多余的行(默认500)
        timeout: 6s # 一次合并事件的超时时间,默认为 5s
    output.logstash:
      hosts: ["127.0.0.1:5044"]
    

    在日志文件中插入以上报错信息,再次查看。
    在这里插入图片描述

    四、其他操作

    4.1 获取所有索引

    在这里插入图片描述

    GET /_cat/indices?v
    

    在这里插入图片描述

    4.2 删除索引

    DELETE /app1-2024.08.02
    
  • 相关阅读:
    Ubuntu server 22.04 安装kvm
    【运筹优化】结合天际线启发式的蚁群算法求解二维矩形装箱问题 + Java代码实现
    基于SSM和Web实现的农作物生长监控系统设计与实现
    隆重推出 Incredibuild 10
    并行多核体系结构基础 Yan Solihin 第4章 针对链式数据结构的并行 摘录
    开源教育论坛| ChinaOSC
    【Linux】进程间通信——共享内存
    深度神经网络的训练过程
    Vue3全网最细介绍使用
    【华为OD机试】最长广播效应【2023 B卷|200分】
  • 原文地址:https://blog.csdn.net/weixin_45549188/article/details/140798459