Elasticsearch7.17 七 :Logstash与FileBeat详解以及ELK整合

ELK Stack与FileBeat实战:日志收集与分析
本文详细介绍了ELK(Elasticsearch, Logstash, Kibana)架构及其两种实现方式,重点讲解了Logstash的核心概念、安装与使用,包括从数据库导入数据到ES。此外,还探讨了FileBeat的功能和安装,以及如何与Logstash配合实现日志收集。最后,展示了如何在实际项目中整合ELK来收集日志。

Logstash与FileBeat详解以及ELK整合

ELK架构

ELK架构分为两种,一种是经典的ELK,另外一种是加上消息队列(Redis或Kafka或RabbitMQ)和Nginx结构。
经典的ELK主要是由Filebeat + Logstash + Elasticsearch + Kibana组成,如下图:(早期的ELK只有Logstash + Elasticsearch + Kibana)
在这里插入图片描述
此架构主要适用于数据量小的开发环境,存在数据丢失的危险。
整合消息队列+Nginx架构:
在这里插入图片描述

Logstash介绍和使用

Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的存储库中。
Logstash核心概念
Pipeline:

  • 包含了input—filter-output三个阶段的处理流程
  • 插件生命周期管理
  • 队列管理

Logstash Event

  • 数据在内部流转时的具体表现形式。数据在input 阶段被转换为Event,在 output被转化成目标格式数据
  • Event 其实是一个Java Object,在配置文件中,对Event 的属性进行增删改查

Codec (Code / Decode)
将原始数据decode成Event;将Event encode成目标数据
在这里插入图片描述
插件
Logstash的配置文件主要分为三个部分input 、filter 、output 。每个部分都可以配置多个插件
Input Plugins:https://www.elastic.co/guide/en/logstash/7.17/input-plugins.html

常见的输入插件:
Stdin / File
Beats / Log4J /Elasticsearch / JDBC / Kafka /Rabbitmq /Redis
JMX/ HTTP / Websocket / UDP / TCP
Google Cloud Storage / S3
Github / Twitter

Output Plugins:https://www.elastic.co/guide/en/logstash/7.17/output-plugins.html

常见的输出插件
Elasticsearch
Email / Pageduty
Influxdb / Kafka / Mongodb / Opentsdb / Zabbix
Http / TCP / Websocket

Filter Plugins:https://www.elastic.co/guide/en/logstash/7.17/filter-plugins.html

事件处理插件
Mutate 一操作Event的字段
Metrics — Aggregate metrics
Ruby 一执行Ruby 代码‘’

Codec Plugins:https://www.elastic.co/guide/en/logstash/7.17/codec-plugins.html

事件编译插件
Line / Multiline
JSON / Avro / Cef (ArcSight Common Event Format)
Dots / Rubydebug

Logstash安装和使用

下载并解压logstash: https://www.elastic.co/cn/downloads/past-releases#logstash
选择版本:7.17.3
测试:运行最基本的logstash

cd logstash-7.17.3
#linux
#-e选项表示,直接把配置放在命令中,这样可以有效快速进行测试
bin/logstash -e 'input { stdin { } } output { stdout {} }'
#windows
.\bin\logstash.bat -e "input { stdin { } } output { stdout {} }"

Logstash导入数据到ES

测试数据集下载:https://grouplens.org/datasets/movielens/
在这里插入图片描述
下载好数据集放到对应的目录 解压
在这里插入图片描述

编写logstash-movie.conf配置文件

input {
  file {
    path => "/usr/local/es/dataset/moves/movies.csv"
    start_position => "beginning"
    sincedb_path => "/dev/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://192.168.10.114:9200"
     index => "movies"
     document_id => "%{id}"
     user => "elastic"
     password => "123456"
   }
  stdout {}
}

运行logstash

# linux
bin/logstash -f logstash-movie.conf

在这里插入图片描述
可以看到原始数据按照这个格式输出。然后来看下es上有没有对应的数据
在这里插入图片描述
在这里插入图片描述

Logstash从数据库中导入数据到ES

测试数据:

#user表
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `address` varchar(50) CHARACTER DEFAULT NULL,
  `last_updated` bigint DEFAULT NULL,
  `is_deleted` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
#插入数据
INSERT INTO user(name,address,last_updated,is_deleted) VALUES("张三","广州天河",unix_timestamp(NOW()),0)

拷贝jdbc依赖到logstash-7.17.3/driver目录下
Logstash配置文件

input {
  jdbc {
    jdbc_driver_library => "/usr/local/es/logstash-7.17.3/driver/mysql-connector-java-5.1.48.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://xxx:3306/user?useSSL=false"
    jdbc_user => "root"
    jdbc_password => "xxx"
     #启用追踪,如果为true,则需要指定tracking_column
    use_column_value => true
    tracking_column => "last_updated"
     #追踪字段的类型,目前只有数字(numeric)和时间类型(timestamp),默认是数字类型
    tracking_column_type => "numeric"
     #记录最后一次运行的结果
    record_last_run => true
      #上面运行结果的保存位置
    last_run_metadata_path => "jdbc-position.txt"
    statement => "SELECT * FROM user_elk where last_updated >:sql_last_value;"
     #定时执行
    schedule => " * * * * * *"
  }
}
output {
  elasticsearch {
    document_id => "%{id}"
    document_type => "_doc"
    index => "users"
    hosts => ["http://192.168.10.114:9200"]
    user => "elastic"
    password => "123456"
  }
  stdout{
    codec => rubydebug
  }
}

运行Logstash
bin/logstash -f config/mysql_data.conf
在这里插入图片描述
说明成功,查看es数据
在这里插入图片描述
当对数据进行增删改查的时候 Logstash回同步的把数据库的变动更新到ES当中,因为 Logstash会定时去执行配置文件中的sql,SELECT * FROM user_elk where last_updated >:sql_last_value :sql_last_value表示最后一次执行成功的时间戳的值,这个值记录在jdbc-position.txt 也是在配置文件中配好的。
而且删除必须是 逻辑删除才会奏效。
测试

# 更新
update user_elk set address="广州白云山",last_updated=unix_timestamp(NOW()) where name="张三"
#删除
update user_elk set is_deleted=1,last_updated=unix_timestamp(NOW()) where name="张三"

在这里插入图片描述
在这里插入图片描述
当我们在数据中进行删除以后,就不能在查出数据,所以要在es中进行过滤

# 添加别名 进行过滤
POST _aliases
{
"actions": [
  {
    "add": {
      "index": "users",
      "alias": "show_users",
      "filter": {
        "term": {
          "is_deleted": "0"
        }
      }
    }
  }
]  
}
# 查询
GET show_users/_search
{
  "query": {
    "term": {
      "name.keyword": {
        "value": "张三"
      }
    }
  }
}

Beats介绍和使用

Beats 是一个免费且开放的平台,集合了多种单一用途的数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据
在这里插入图片描述
FileBeat简介
FileBeat专门用于转发和收集日志数据的轻量级采集工具。它可以作为代理安装在服务器上,FileBeat监视指定路径的日志文件,收集日志数据,并将收集到的日志转发到Elasticsearch或者Logstash。
FileBeat的工作原理
启动FileBeat时,会启动一个或者多个输入(Input),这些Input监控指定的日志数据位置。FileBeat会针对每一个文件启动一个Harvester。Harvester读取每一个文件的日志,将新的日志发送到libbeat,libbeat将数据收集到一起,并将数据发送给输出(Output)。
logstash vs FileBeat

  • Logstash是在jvm上运行的,资源消耗比较大。而FileBeat是基于golang编写的,功能较少但资源消耗也比较小,更轻量级。
  • Logstash 和Filebeat都具有日志收集功能,Filebeat更轻量,占用资源更少
  • Logstash 具有Filter功能,能过滤分析日志
  • 一般结构都是Filebeat采集日志,然后发送到消息队列、Redis、MQ中,然后Logstash去获取,利用Filter功能过滤分析,然后存储到Elasticsearch中
  • FileBeat和Logstash配合,实现背压机制。当将数据发送到Logstash或 Elasticsearch时,Filebeat使用背压敏感协议,以应对更多的数据量。如果Logstash正在忙于处理数据,则会告诉Filebeat 减慢读取速度。一旦拥堵得到解决,Filebeat就会恢复到原来的步伐并继续传输数据。

FileBeat的安装和使用

下载并解压Filebeat
下载地址:https://www.elastic.co/cn/downloads/past-releases#filebeat

编辑配置
修改 filebeat.yml 以设置连接信息:

output.elasticsearch:
  hosts: ["192.168.10.111:9200","192.168.10.112:9200","192.168.10.114:9200"]
  username: "elastic"
  password: "123456"
setup.kibana:
  host: "192.168.10.111:5601"

启用和配置数据收集模块

# 查看可以模块列表
./filebeat modules list
#启用 Logstash 模块
./filebeat modules enable logstash
#在 modules.d/logstash.yml 文件中修改设置
- module: logstash
  log:
    enabled: true
    var.paths: ["/usr/local/es/logstash-7.17.3/logs/*.log"]

启动 Filebeat

# setup命令加载Kibana仪表板。 如果仪表板已经设置,则忽略此命令。 
./filebeat setup
# 启动Filebeat
./filebeat -e 

在这里插入图片描述

ELK整合收集项目日志

有两台服务器 ip分别为 xxx.217和xxx.108。其中217部署项目,108部署Logstash、kibana、es。由于filebeat需要收集日志,所以filebeat部署在271服务器
kibana、es按照之前博客配置能启动就好 不需要额外配置。本次案例不使用密码认证,如果es配置了密码的话,相应的Logstash、kibana也要配置响应密码。
项目的日志路径
/usr/local/springcloud/xxx/logs
filebeat部署
安装下载安装就不再说了,具体配置
filebeat.yml

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      # 当前目录下的所有.log文件
      - /usr/local/springcloud/xxx/logs/*.log
    multiline.pattern: ^\[
    multiline.negate: true
    multiline.match: after
  - type: tcp
    enabled: true
    max_message_size: 10MiB
    # 监听9000端口
    host: "0.0.0.0:9000"
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.dashboards.enabled: false
setup.kibana:
  host: "http://xxx.108:5601"
output.logstash:
  # The Logstash hosts
  hosts: ["xxx.108:5044"]
processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

执行./filebeat setup没报错即可退出

Logstash部署
下载安装也不再说。看配置
logstash.yml
http.host: "0.0.0.0"
编写filebeat输入到Logstash的配置文件
xxx-log-logstash.conf

input {
    # 来源beats
    beats {
        # 端口
        port => "5044"
    }
}
# 分析、过滤插件,可以多个
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
    geoip {
        source => "clientip"
    }
}
output {
    # 选择elasticsearch
    elasticsearch {
        hosts => ["http://xxx.108:9200"]
        index => "xxx-log-%{+YYYY.MM.dd}"
    }
}

日志收集
按顺序启动es,启动kibana,启动Logstash,启动filebeat
记得开放对应的端口。
filebeat的数据来源:1. 从9000端口监听数据 2. 扫描日志路径下的日志文件,所以需要开启9000端口
Logstash的监听来自5044端口打的数据,因此需要开放5044端口。
启动成功后从kibana上查看数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出现对应xxx-log-日期的索引。再看下具体数据
首先创建索引模式
在这里插入图片描述
在这里插入图片描述
我这里是已经创建好了的。
创建好后点击
在这里插入图片描述
在这里插入图片描述
就可以从这里更直观的看到数据

<think>嗯,用户需要一个在openEuler上部署ELK+Kafka+Filebeat的完整教程。这个问题涉及多个组件的协同部署,技术细节相当复杂。用户提供的站内引用很有价值,特别是引用[3]提到了系统优化和目录配置,引用[4]则提供了详细的组件下载链接和用户权限设置。需要特别注意的是,这些引用都是基于CentOS环境的配置,而openEuler作为新兴系统,可能需要调整部分设置。从问题描述看,用户应该是个运维工程师或DevOps人员,正在搭建日志分析系统。用户特别强调"详细教程",说明ta需要可落地的操作指导,且对权限控制(如root和app用户切换)、目录结构等细节要求明确。在技术层面,这个部署需要重点考虑:第一是版本兼容性。ELK组件需版本严格匹配,选择6.7.2版本族较稳妥,用户引用的[4]也采用了这个版本组合。第二是系统差异。openEuler的SELinux策略、firewalld配置CentOS存在差异,比如默认可能没开放5601端口。第三是内存管理。Elasticsearch的堆内存设置要遵循不超过物理内存50%的原则(引用[3]提到过)。第四是用户权限。必须像引用[4]那样创建专用用户,避免用root运行组件。安装步骤上可以分解为个主要阶段:准备工作→JDK→ZooKeeper→Kafka→ElasticsearchLogstash→Kibana→Filebeat。其中ES的配置最复杂,要处理jvm.options、elasticsearch.yml等多个文件,还需安装ik/pinyin分词插件。安全方面需要额外提醒:用户引用中都没提及SSL/TLS配置,但生产环境必须考虑加密通信,特别是Kafka的SASL认证和ES的xpack安全模块。最后生成的注意事项特别重要,比如内核参数调整和filebeat多行日志处理,这些都是实际部署中容易踩坑的点。考虑到用户环境,补充了openEuler特有的firewall-cmd用法。</think> 以下是在 openEuler 系统上部署 Elastic Stack(Elasticsearch/Logstash/Kibana) + Kafka + Filebeat 的详细步骤,结合系统特性和最佳实践: --- ### **一、环境准备** 1. **系统要求** - OpenEuler 20.03 LTS+(已验证版本) - 至少 8GB RAM(生产环境建议 16GB+) - 磁盘空间:50GB+(依据日志量调整) 2. **创建专用用户** ```bash sudo useradd elk -m -s /bin/bash # 创建elk用户 echo "elk:your_password" | sudo chpasswd # 设置密码 sudo chown elk:elk /opt -R # 授权/opt目录 ``` 3. **安装依赖** ```bash sudo dnf install java-11-openjdk-devel wget tar unzip firewalld -y sudo systemctl start firewalld ``` --- ### **二、组件安装配置** #### **1. ZooKeeper 3.4.10** ```bash wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz tar -xzf zookeeper-3.4.10.tar.gz -C /opt cd /opt/zookeeper-3.4.10/conf cp zoo_sample.cfg zoo.cfg sed -i 's|dataDir=/tmp/zookeeper|dataDir=/opt/zookeeper/data|' zoo.cfg ``` **启动**: ```bash bin/zkServer.sh start ``` #### **2. Kafka 2.3.0** ```bash wget https://archive.apache.org/dist/kafka/2.3.0/kafka_2.12-2.3.0.tgz tar -xzf kafka_2.12-2.3.0.tgz -C /opt cd /opt/kafka_2.12-2.3.0/config echo -e "listeners=PLAINTEXT://:9092\nlog.dirs=/opt/kafka/logs" >> server.properties ``` **启动**: ```bash bin/kafka-server-start.sh -daemon config/server.properties ``` #### **3. Elasticsearch 7.17.5**(推荐兼容版本) ```bash wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.5-linux-x86_64.tar.gz tar -xzf elasticsearch-7.17.5-linux-x86_64.tar.gz -C /opt cd /opt/elasticsearch-7.17.5 ``` **配置修改** (`config/elasticsearch.yml`): ```yaml cluster.name: elk-openEuler node.name: node-1 path.data: /data/elasticsearch/data path.logs: /data/elasticsearch/logs network.host: 0.0.0.0 http.port: 9200 discovery.type: single-node # 单节点模式 ``` **系统优化**: ```bash sudo sysctl -w vm.max_map_count=262144 # 解决内存映射错误 mkdir -p /data/elasticsearch/{data,logs} chown elk:elk /data/elasticsearch -R ``` **启动**: ```bash su elk -c "/opt/elasticsearch-7.17.5/bin/elasticsearch -d" ``` #### **4. Kibana 7.17.5** ```bash wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.5-linux-x86_64.tar.gz tar -xzf kibana-7.17.5-linux-x86_64.tar.gz -C /opt cd /opt/kibana-7.17.5 ``` **配置修改** (`config/kibana.yml`): ```yaml server.port: 5601 server.host: "0.0.0.0" elasticsearch.hosts: ["http://localhost:9200"] ``` **开放防火墙端口**: ```bash sudo firewall-cmd --add-port=5601/tcp --permanent sudo firewall-cmd --reload ``` **启动**: ```bash su elk -c "nohup /opt/kibana-7.17.5/bin/kibana > /dev/null &" ``` #### **5. Logstash 7.17.5** ```bash wget https://artifacts.elastic.co/downloads/logstash/logstash-7.17.5.tar.gz tar -xzf logstash-7.17.5.tar.gz -C /opt ``` **创建配置文件** (`/opt/logstash-7.17.5/config/kafka_to_es.conf`): ```ruby input { kafka { bootstrap_servers => "localhost:9092" topics => ["logs"] } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "logs-%{+YYYY.MM.dd}" } } ``` **启动**: ```bash su elk -c "/opt/logstash-7.17.5/bin/logstash -f config/kafka_to_es.conf" ``` #### **6. Filebeat 7.17.5** ```bash wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.5-linux-x86_64.tar.gz tar -xzf filebeat-7.17.5-linux-x86_64.tar.gz -C /opt cd /opt/filebeat-7.17.5 ``` **配置修改** (`filebeat.yml`): ```yaml filebeat.inputs: - type: log enabled: true paths: - /var/log/*.log output.kafka: hosts: ["localhost:9092"] topic: logs ``` **启动**: ```bash sudo ./filebeat -e -c filebeat.yml ``` --- ### **三、验证部署** 1. **发送测试数据** ```bash echo "Test log from openEuler" >> /var/test.log ``` 2. **检查Kafka队列** ```bash /opt/kafka_2.12-2.3.0/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic logs ``` 3. **在Kibana查看日志** 访问 `http://<服务器IP>:5601` → Management → Index Patterns → 创建 `logs-*` 索引模式 --- ### **注意事项** 1. **权限问题** - 所有组件需以 `elk` 用户运行 - 数据目录权限:`chown elk:elk /data -R` 2. **内存限制** Elasticsearch 堆内存配置 (`config/jvm.options`): ``` -Xms4g -Xmx4g # 不超过物理内存50% ``` 3. **分词插件安装**(如需要) ```bash /opt/elasticsearch-7.17.5/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.5/elasticsearch-analysis-ik-7.17.5.zip ``` 4. **多行日志处理** 在 Filebeat 中添加多行合并配置: ```yaml multiline.pattern: '^\[' multiline.negate: true multiline.match: after ``` --- ### **故障排查关键点** 1. Elasticsearch 启动失败 - 检查 `/data/elasticsearch/logs/*.log` - 确认 `vm.max_map_count` 设置 2. Kafka 连接问题 - 验证 ZooKeeper 状态:`echo stat | nc localhost 2181` - 检查防火墙:`sudo firewall-cmd --list-ports` 3. Filebeat 无数据 - 运行调试模式:`sudo ./filebeat -e -c filebeat.yml -d "publish"` > 部署框架基于 ELK Stack 官方文档[^1] openEuler 系统适配实践,具体参数需按硬件配置调整[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值