超详细,elk+kafka+filebeat日志收集,filebeat收集的不同日志生成不同的topic,不同的topic生成不同的索引

Filebeat+Kafka+数据处理服务+Elasticsearch+Kibana+Skywalking日志收集系统 该文档不会为读者提供中间件的安装和部署教学,仅作为我在这大半年从零开始建立日志收集系统的整个过程。 读者能从本文看到一条从零开始的日志收集系统的建立通路,能看到我选择和处理的过程和碎碎念... 阅读详情

项目主机规划

主机名

外网IP

安装软件

所属集群

elstack

192.168.1.176

elasticsearch8.4

logstash

192.168.1.178

logstash8.4+Kibana8.4

kafka

192.168.1.179

kafka+zookeeper

1、环境准备

1.1 配置hosts文件

[yu@elk~]$ sudo vim /etc/hosts

192.168.1.177 elk

192.168.1.178 logstash

192.168.1.179 kafka

推送hosts文件到 yu的其他主机上

[yu@elk~]$ sudo scp /etc/hosts 192.168.1.178:/etc/hosts

[yu@elk~]$ sudo scp /etc/hosts 192.168.1.179:/etc/hosts

1.2、elk软件下载地址

 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.4.0-linux-x86_64.tar.gz

 wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.4.0-linux-x86_64.tar.gz

 wget https://artifacts.elastic.co/downloads/logstash/logstash-8.4.0-linux-x86_64.tar.gz

 wget https://artifacts.elastic.co/downloads/kibana/kibana-8.4.0-linux-x86_64.tar.gz

1.3、kafka+zookeeper下载地址

wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.2/apache-zookeeper-3.7.2-bin.tar.g

wget https://downloads.apache.org/kafka/3.2.1/kafka_2.13-3.2.1.tgzkafka_2.12-3.6.1https://downloads.apache.org/kafka/3.2.1/kafka_2.13-3.2.1.tgz

 2、部署elasticsearch

2.1、上传elasticsearch安装包

下载地址

2.2、解压软件包

[yu@elk~]$  cd /tmp

[yu@elk tmp]$ sudo tar -zxvf elasticsearch-8.4.0-linux-x86_64.tar.gz -C /usr/local/

2.3、给文件授权

[yu@elk~]$ sudo chown -R yu:yu /usr/local/elasticsearch-8.4.0/

2.4、修改linux系统打开文件最大数

[yu@elk~]$ sudo vim /etc/sysctl.conf

vm.max_map_count=655360

[yu@elk~]$ sudo  sysctl -p /etc/sysctl.conf

[yu@elk~]$ sudo  vim /etc/security/limits.conf 

#在文件最后添加以下行

#修改最大打开文件数

* soft nofile 65536

* hard nofile 65536

# 修改最大进程数

* soft nproc 65536

* hard nproc 65536

2.5、安装jdk

由于YU 3个软件都需要JDK只支持,所以只要安装Elasticsearch + Logstash + Kibana的服务器都要装JDK,

Elasticsearch安装包自带jdk,我们使用自带版本

[yu@elk~]$  ll /usr/local/elasticsearch-8.4.0/

推送jdk到logstash服务器上

[yu@elk~]$  sudo scp -r  /usr/local/elasticsearch-8.4.0/jdk  logstash:/usr/local/

2.6、配置JDK环境变量

[yu@elk~]$ sudo vim /etc/profile  #在文件最后加入一下行

export JAVA_HOME=/usr/local/elasticsearch-8.4.0/jdk

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME  PATH CLASSPATH

[yu@elk~]$  source /etc/profile   #使环境变量生效

2.7、修改配置文件

[yu@elk~]$ cd /usr/local/elasticsearch-8.4.0/

[yu@elkelasticsearch-8.4.0]$ vim config/elasticsearch.yml

cluster.name: my-application

node.name: node-1

bootstrap.memory_lock: false  #防止启动检测报错

network.host: 0.0.0.0   #修改监听IP

http.port: 9200

cluster.initial_master_nodes: ["node-1"]

xpack.security.enabled: false   #关闭安全认证,否则使用http访问不到es,第一次启动没有这个参数,第二次启动再关闭

xpack.security.http.ssl:

  enabled: false

2.8、启动Elasticsearch

[yu@elkelasticsearch-8.4.0]$  ./bin/elasticsearch

2.8、修改配置文件后再次启动,后台启动

[yu@elk elasticsearch-8.4.0]$ vim config/elasticsearch.yml

xpack.security.enabled: false   #关闭安全认证,否则使用http访问不到es,第一次启动没有这个参数,第二次启动再关闭

xpack.security.http.ssl:

  enabled: false

[yu@elk elasticsearch-8.4.0]$ ./bin/elasticsearch &

2.9、测试

网页 192.168.1.177:9200

2.10、加入开机自启动

[yu@elk elasticsearch-8.4.0]$ sudo  vim /etc/init.d/elasticsearch

#!/bin/sh

#chkconfig: 2345 80 05

#description: elasticsearch

#author: taft

export JAVA_HOME=/usr/local/elasticsearch-8.4.0/jdk

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVA_HOME  PATH CLASSPATH

case "$1" in

start)

    su yu<<!

    cd /usr/local/elasticsearch-8.4.0/

    ./bin/elasticsearch -d

!

    echo "elasticsearch startup"

    ;;

stop)

    es_pid=`jps | grep Elasticsearch | awk '{print $1}'`

    kill -9 $es_pid

    echo "elasticsearch stopped"

    ;;

restart)

    es_pid=`jps | grep Elasticsearch | awk '{print $1}'`

    kill -9 $es_pid

    echo "elasticsearch stopped"

    su yu<<!

    cd /usr/local/elasticsearch-8.4.0/

    ./bin/elasticsearch -d

!

    echo "elasticsearch startup"

    ;;

*)

    echo "start|stop|restart"

    ;;

esac

exit $?

su yu<<! 切换为yu用户执行下面的命令,<<! 相当于<<EOF

注意:

以上脚本的用户为yu,如果你的用户不是,则需要替换

以上脚本的JAVA_HOME以及elasticsearch_home如果不同请替换

[yu@elk~]$ sudo chmod +x /etc/init.d/elasticsearch #给脚本添加权限

[yu@elk~]$ sudo  chkconfig --add /etc/init.d/elasticsearch  #添加开机自启动

[yu@elk~]$ sudo  chkconfig elasticsearch on

2.11、测试脚本

[yu@elk~]$  sudo systemctl restart elasticsearch

[yu@elk~]$  ps -aux | grep elasticsearch

3、安装Kibana

3.1、上传Kibana安装包

[yu@logstash ~]$   cd /tmp

[yu@logstash ~]$ ls

3.2、解压软件包

[yu@logstash tmp]$  sudo  tar -zxvf kibana-8.4.0-linux-x86_64.tar.gz -C /usr/local/

3.3、给文件授权

[yu@logstash ~]$ sudo chown -R yu:yu /usr/local/kibana-8.4.0

3.4、修改配置文件

[yu@logstash tmp]$ cd

[yu@logstash ~]$  sudo  vim /usr/local/kibana-8.4.0/config/kibana.yml

#开启以下选项并修改

server.port: 5601

server.host: "192.168.1.178"

elasticsearch.hosts: ["http://192.168.1.176:9200"]  #修改elasticsearch地址,多个服务器请用逗号隔开。

i18n.locale: "zh-CN"                          #修改语言为中文

注意: host:与IP地址中间有个空格不能删除,否则报错。

3.5、启动服务

[yu@logstash ~]$  /usr/local/kibana-8.4.0/bin/kibana

3.6、kibana 设置后台启动

[yu@logstash ~]$ nohup /usr/local/kibana-8.4.0/bin/kibana &

[yu@logstash ~]$ ps -ef | grep kibana

3.7、网页测试

192.168.1.177:5601

4、搭建kafka服务 在kafka服务器上

4.1、环境搭建

4.11、上传kafka、zookeeper、jdk安装包 到/tmp目录下

[yu@kafka ~]$ ll  /tmp

4.1.2、解压jdk

[yu@kafka ~]$ cd /tmp

[yu@kafka tmp]$ sudo  tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/

4.1.3配置JDK环境变量

[yu@kafka tmp]$ sudo  vim /etc/profile 

#在文件最后加入一下行

JAVA_HOME=/usr/local/jdk1.8.0_171

PATH=$JAVA_HOME/bin:$PATH

CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar

export PATH JAVA_HOME CLASSPATH

[yu@kafka tmp]$ source /etc/profile

4.1.4、查看java环境

[yu@kafka tmp]$ java –version

4.2、安装zookeepe

4.2.1解压zookeeper安装包

[yu@kafka tmp]$ sudo tar -zxf apache-zookeeper-3.7.2-bin.tar.gz  -C /usr/local/

4.2.2、创建快照日志存放目录并赋予权限:

[yu@kafka tmp]$ sudo mkdir -p /data/zk/data

[yu@kafka tmp]$  sudo chmod -R 777 /data/zk/data

4.2.3、 创建事务日志存放目录:

[yu@kafka tmp]$ sudo mkdir -p /data/zk/datalog

[yu@kafka tmp]$  sudo chmod -R 777  /data/zk/datalog

4.2.4、生成配置文件

[yu@kafka tmp]$  cd /usr/local/apache-zookeeper-3.7.2-bin/conf/

[yu@kafka conf]$ sudo cp zoo_sample.cfg  zoo.cfg

4.2.5、修改主配置文件zoo.cfg

dataDir=/data/zk/data        #修改这一行为我们创建的目录

dataLogDir=/data/zk/datalog   #添加这一行

4.2.6、添加path环境变量

[yu@kafka conf]$ sudo vim /etc/profile

export ZOOKEEPER_HOME=/usr/local/apache-zookeeper-3.7.2-bin

export PATH=$ZOOKEEPER_HOME/bin:$PATH

[yu@kafka conf]$  source /etc/profile

4.2.7、给文件授权

[yu@kafka conf]$  sudo chown -R yu:yu /usr/local/apache-zookeeper-3.7.2-bin

4.2.8、启动Zookeeper

[yu@kafka conf]$ zkServer.sh start

4.2.9、验证

[yu@kafka conf]$ zkServer.sh status

4.2.10、添加开机启动

在/lib/systemd/system/文件夹下创建一个启动脚本zookeeper.service

[yu@kafka conf]$ sudo vim /lib/systemd/system/zookeeper.service

[Unit]

Description=Zookeeper service

After=network.target

[Service]

Type=forking

Environment="JAVA_HOME=/usr/local/jdk1.8.0_171"

ExecStart=/usr/local/apache-zookeeper-3.7.2-bin/bin/zkServer.sh start

ExecStop=/usr/local/apache-zookeeper-3.7.2-bin/bin/zkServer.sh stop

[Install]

WantedBy=multi-user.target

[yu@kafka conf]$  sudo systemctl daemon-reload

[yu@kafka conf]$ sudo  systemctl enable zookeeper

测试:

[yu@kafka conf]$ jps

67608 Jps

67439 QuorumPeerMain

[yu@kafka conf]$ kill 67439

[yu@kafka conf]$ jps

67620 Jps

[yu@kafka conf]$ sudo systemctl start zookeeper

[yu@kafka conf]$ ps -ef |grep zookeeper

4.3.Kafka 单节点单Broker部署

这里部署的是kafka单节点,生产环境应该部署kafka多节点集群。

4.3.1解压软件到指定目录

[yu@kafka conf]$ cd /tmp

[yu@kafka tmp]$ sudo  tar -zxvf kafka_2.12-3.6.1.tgz  -C /usr/local/

4.3.2 修改配置文件

[yu@kafka tmp]$ sudo  vim /usr/local/kafka_2.12-3.6.1/config/server.properties

# broker的全局唯一编号,不能重复

broker.id=0

# 监听

listeners=PLAINTEXT://:9092  #开启此项

# 日志目录

log.dirs=/data/kafka/log      #修改日志目录

# 配置zookeeper的连接(如果不是本机,需要该为ip或主机名)

zookeeper.connect=localhost:2181

auto.create.topics.enable=true  自动创建topic  添加这一条

4.3.3、创建日志目录并改权限

[yu@kafka tmp]$ sudo mkdir -p /data/kafka/log

[yu@kafka tmp]$  sudo chmod -R 777 /data/kafka/log

4.3.4添加path环境变量

[yu@kafka tmp]$ sudo vim /etc/profile

export KAFKA_HOME=/usr/local/kafka_2.12-3.6.1

export PATH=$KAFKA_HOME/bin:$PATH

[yu@kafka tmp]$  source /etc/profile

4.3.5、给文件授权

[yu@kafka tmp]$ sudo chown -R yu:yu /usr/local/kafka_2.12-3.6.1

4.3.6、启动kafka

后台启动kafka

[yu@kafka tmp]$ kafka-server-start.sh -daemon /usr/local/kafka_2.12-3.6.1/config/server.properties

4.3.7添加开机自启

将kafka添加到开机自启服务

在/lib/systemd/system/文件夹下创建一个启动脚本kafka.service

[yu@kafka tmp]$ sudo  vim /lib/systemd/system/kafka.service

[Unit]

Description=Apache Kafka server (broker)

After=network.target  zookeeper.service

[Service]

Type=simple

Environment="PATH=/usr/local/jdk1.8.0_171/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"

ExecStart=/usr/local/kafka_2.12-3.6.1/bin/kafka-server-start.sh /usr/local/kafka_2.12-3.6.1/config/server.properties

ExecStop=/usr/local/kafka_2.12-3.6.1/bin/kafka-server-stop.sh

Restart=on-failure

[Install]

WantedBy=multi-user.target

[yu@kafka tmp]$ sudo  systemctl daemon-reload

[yu@kafka tmp]$ sudo systemctl enable kafka

测试

[yu@kafka tmp]$ jps

68931 Jps

68799 Kafka

[yu@kafka tmp]$ kill 68799

[yu@kafka tmp]$ jps

68954 Jps

[yu@kafka tmp]$ sudo  systemctl start kafka

[yu@kafka tmp]$ sudo  systemctl status  kafka

5、 设置filebeat 在kafka服务器上,收集kafka服务器的日志

5.1、上传软件包

5.2、解压缩软件

[yu@kafka tmp]$ sudo  tar -zxvf filebeat-8.4.0-linux-x86_64.tar.gz -C /usr/local/

5.3、给文件授权

[yu@kafka tmp]$  sudo chown -R yu:yu /usr/local/filebeat-8.4.0-linux-x86_64

[yu@ kafka tmp]$  sudo chmod o+r  /var/log/*

5.4、修改配置文件

Filebeat 要求配置文件只能由其所有者写入,不允许组(group)和其他用户(others)也有写权限。

[yu@kafka tmp]$ sudo vim /usr/local/filebeat-8.4.0-linux-x86_64/filebeat.yml

filebeat.idle_timeout: 2s

filebeat.name: filebeat-shiper

filebeat.spool_size: 50000

filebeat.inputs:

- type: log

  paths:

    - /usr/local/kafka_2.12-3.6.1/logs/controller.log

  fields:

    topic: topic-kafka-controller-log

  enabled: true

  backoff: 1s

  backoff_factor: 2

  close_inactive: 1h

  encoding: plain

  harvester_buffer_size: 262144

  max_backoff: 10s

  max_bytes: 10485760

  scan_frequency: 10s

  tail_lines: true

- type: log

  paths:

    - /usr/local/kafka_2.12-3.6.1/logs/state-change.log

  fields:

    topic: topic-kafka-state-change-log

  enabled: true

  backoff: 1s

  backoff_factor: 2

  close_inactive: 1h

  encoding: plain

  harvester_buffer_size: 262144

  max_backoff: 10s

  max_bytes: 10485760

  scan_frequency: 10s

  tail_lines: true

- type: log

  paths:

    -  /usr/local/kafka_2.12-3.6.1/logs/server.log

  fields:

    topic: topic-kafka-run-log

  enabled: true

  backoff: 1s

  backoff_factor: 2

  close_inactive: 1h

  encoding: plain

  harvester_buffer_size: 262144

  max_backoff: 10s

  max_bytes: 10485760

  scan_frequency: 10s

  tail_lines: true

- type:  log

  paths:

    -  /usr/local/kafka_2.12-3.6.1/logs/kafka-request.log

  fields:

    topic: topic-kafka-request-log

  enabled: true

  backoff: 1s

  backoff_factor: 2

  close_inactive: 1h

  encoding: plain

  harvester_buffer_size: 262144

  max_backoff: 10s

  max_bytes: 10485760

  scan_frequency: 10s

  tail_lines: true

- type:  log

  paths:

    -  /var/log/messages

  fields:

    topic: topic-kafka-messages-log

  enabled: true

  backoff: 1s

  backoff_factor: 2

  close_inactive: 1h

  encoding: plain

  harvester_buffer_size: 262144

  max_backoff: 10s

  max_bytes: 10485760

  scan_frequency: 10s

  tail_lines: true

output.kafka:          

  bulk_flush_frequency: 0

  bulk_max_size: 2048

  codec.format:

    string: '%{[message]}'

  compression: gzip

  compression_level: 4

  hosts:

  - 192.168.1.179:9092

  max_message_bytes: 10485760

  partition.round_robin:

    reachable_only: true

  required_acks: 1

  topic: '%{[fields.topic]}'

setup.ilm.enabled: false

配置文件详解

全局配置

filebeat.idle_timeout: 2s:

#Filebeat在没有数据发送时保持打开状态的超时时间。

filebeat.name: filebeat-apache:

#Filebeat实例的名称,这有助于在日志和监控中识别它。每个单独的filebeat实例的名称必须不同

filebeat.spool_size: 50000:

#Filebeat内部使用的队列大小,它决定了可以缓冲多少个事件。

输入配置

type: log:

#指定输入类型为日志。

paths:

#定义Filebeat需要监控的日志文件的路径。这里指定的是/usr/local/apache/logs/access_log。

fields:

#允许你添加自定义字段到输出的事件中。这里添加了一个topic字段,值为topic-apache-access-log。

enabled: true:

#启用此输入配置。

backoff: 1s和 close_inactive: 1h:

#在读取文件遇到错误时,Filebeat会等待backoff指定的时间,然后每次重试等待的时间会乘以backoff_factor。

close_inactive:

#如果文件在给定的时间段内没有新事件,Filebeat将关闭文件句柄。

#句柄(Handle)在计算机科学中是一个用来标识对象或资源的引用或者指针。在操作系统和许多软件应用程序中,句柄被用作一个内部标识符,它允许程序访问和操作系统或应用程序中的对象或资源,而无需直接知道对象的内存地址或其他详细信息。

encoding: plain

#指定日志文件的编码方式。

harvester_buffer_size: 262144

#读取文件时使用的缓冲区大小。

max_backoff: 10s

#最大重试等待时间。

max_bytes: 10485760

#单个事件的最大字节数。

scan_frequency: 10s

#Filebeat检查指定路径下的新文件的频率。

tail_lines: true

#如果设置为true,Filebeat将从文件末尾开始读取,这通常用于实时日志流。

输出配置

output.kafka:

#指定输出到Kafka的配置。

  bulk_flush_frequency: 0

#批量发送事件到Kafka的频率,这里设置为0,意味着立即发送。

bulk_max_size:

#批量发送事件的最大数量。

  codec.format:

    string: '%{[message]}'

#这表示Filebeat将使用字符串格式来格式化输出到Kafka的消息,并且该字符串的内容将是日志事件中的message字段。%{[message]} 是一个字段引用,它告诉Filebeat从每个日志事件中提取message字段的值,并将其作为Kafka消息的内容。

  compression: gzip 和  compression_level: 4

#启用压缩,并设置压缩级别。

hosts:

#Kafka服务器的地址和端口。

max_message_bytes: 10485760

#Kafka消息的最大字节数。

  partition.round_robin:

    reachable_only: true

#partition.round_robin 设置启用了轮询(round-robin)策略,即Filebeat将按顺序将数据分发到Kafka的可用分区。这种策略确保在没有特定分区选择逻辑的情况下,数据能够均匀地在所有分区之间分布。reachable_only: true 是partition.round_robin下的一个子选项,它指定Filebeat只选择可达(reachable)的分区来发送数据。

  required_acks: 1

#Kafka要求的确认数量,确保消息已经被写入。

  topic: '%{[fields.topic]}'

#使用前面在fields中定义的topic字段的值作为Kafka的topic。

setup.ilm.enabled: false

#禁用索引生命周期管理(ILM)。

5.5、启动filebeat

[yu@kafka tmp]$  cd /usr/local/filebeat-8.4.0-linux-x86_64/ && ./filebeat -e -c filebeat.yml &

-e: 这个选项告诉Filebeat以“输出到标准错误”(Error output)的模式运行。这意味着所有的日志和错误信息会直接打印到控制台,而不是写入日志文件。这有助于在调试过程中快速查看问题。 测试时使用测试成功后取消这一个选项

-c filebeat.yml: 这个选项指定了Filebeat的配置文件路径。在这个例子中,配置文件是filebeat.yml,它应该包含Filebeat如何收集、处理和转发日志的指令。

5.6、再开一个终端查看kafka主题是否创建

[yu@kafka logs]$ kafka-topics.sh --bootstrap-server kafka:9092 --list

topic-kafka-controller-log

topic-kafka-run-log

topic-kafka-state-change-log

表示kafka接收到filebeat收集到的日志

5.7设置开机自启动

[yu@kafka logs]$ sudo  echo "nohup /usr/local/filebeat-8.4.0-linux-x86_64/filebeat -e -c /usr/local/filebeat-8.4.0-linux-x86_64/filebeat.yml &" >> /etc/rc.d/rc.local

6、搭建logstash服务器

6.1、上传软件包

6.2、解压缩软件

[yu@logstash tmp]$ sudo  tar -zxvf logstash-8.4.0-linux-x86_64.tar.gz -C /usr/local/

6.3、给文件授权

[yu@logstash tmp]$ sudo chown -R yu:yu /usr/local/logstash-8.4.0/

6.4、做软连接

[yu@logstash tmp]$ sudo  ln -s /usr/local/logstash-8.4.0/bin/* /usr/local/bin/

6.5、生成配置文件

input {

  kafka {

    bootstrap_servers => "192.168.1.179:9092"

    topics_pattern => "topic.*"

    consumer_threads => 5

    decorate_events => true

    codec => plain { charset => "UTF-8" }

    auto_offset_reset => "latest"

    group_id => "logstash1"

  }

}

filter {

  # 如果需要转换时间戳为本地时间,请取消注释并正确编写Ruby代码

  # 注意:下面的代码可能需要调整,确保它符合您的具体需求

  #ruby {

  #  code => "event.set('@timestamp', Time.parse(event.get('time')).localtime)"

  #}

  mutate {

    remove_field => ["beat"]

  }

  grok {

    match => {

      "message" => "\[(?<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\] \[(?<level>\w+)\] (?<thread>[\w|-]+) (?<class>[\w|\.]+) (?<lineNum>\d+):(?<msg>.+)"

    }

 overwrite => ["message"]

    tag_on_failure => ["_grokparsefailure"]

  }

  if "[@metadata][kafka][topic]" {

    mutate {

      add_field => { "topic_name" => "%{[@metadata][kafka][topic]}" }

    }

  }

}

output {

  # 确保topic_name字段存在才发送到Elasticsearch

  if [topic_name] {

    elasticsearch {

      hosts => ["192.168.1.177:9200"]

      # 使用topic_name字段来构建索引名

      index => "%{topic_name}-%{+YYYY.MM.dd}"

    }

  }

  stdout {

    codec => rubydebug

  }

}

配置文件详解

Input部分

input { 

  kafka { 

    bootstrap_servers => "192.168.1.179:9092" 

#Kafka集群的地址和端口。

    topics_pattern => "topic.*" 

#订阅所有以"topic."开头的Kafka主题。

    consumer_threads => 5 

#消费者线程数,用于并行读取Kafka消息。

    decorate_events => true 

#的配置选项用于控制是否在Logstash事件中添加与Kafka相关的元数据字段。当设置为true时,Logstash会向每个事件添加一些额外的字段,这些字段包含了关于Kafka消息的一些信息。

    codec => plain { charset => "UTF-8" } 

#告诉Logstash以UTF-8编码的方式从Kafka消息中读取纯文本数据,并将其转换为Logstash事件以供后续处理。这样,无论Kafka中的消息包含何种字符,Logstash都能够正确解析并处理它们。codec => json 用于指定输入插件使用JSON格式来解码数据。这通常用于处理存储在Kafka等消息队列中的JSON格式的消息。

    auto_offset_reset => "latest" 

#它决定了当Logstash开始消费Kafka主题时,从哪里开始读取消息。

auto_offset_reset 参数有以下几个可能的值:

"earliest": 从最早的记录开始读取,即从头开始消费。

"latest": 从最新的记录开始读取,即只消费在Logstash开始消费之后新产生的消息。

"none": 如果找不到初始偏移量,就抛出异常。

    group_id => "logstash1" 

  } 

}

Filter部分

filter { 

  # ... Ruby代码块(已注释) 

  mutate { 

    remove_field => ["beat"] 

#mutate:移除beat字段

  } 

  grok { 

    match => { 

      "message" => "\[(?<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\] \[(?<level>\w+)\] (?<thread>[\w|-]+) (?<class>[\w|\.]+) (?<lineNum>\d+):(?<msg>.+)" 

#使用正则表达式解析message字段,并提取出时间、日志级别、线程、类名、行号和消息内容等字段。

    } 

    overwrite => ["message"] 

#将原始message字段替换为grok解析后的内容。

    tag_on_failure => ["_grokparsefailure"] 

#如果grok解析失败,则给事件添加一个标签_grokparsefailure

  } 

  if "[@metadata][kafka][topic]" { 

    mutate { 

      add_field => { "topic_name" => "%{[@metadata][kafka][topic]}" } 

#if条件判断:如果事件中存在[@metadata][kafka][topic]字段,则添加一个名为topic_name的新字段,其值为Kafka主题名。

    } 

  } 

}

Output部分

output { 

  if [topic_name] { 

#只有当事件中存在topic_name字段时,才执行下面的输出操作。

    elasticsearch { 

      hosts => ["192.168.1.177:9200"] 

      index => "%{topic_name}-%{+YYYY.MM.dd}" 

#使用topic_name和日期来构建索引名。

    } 

  } 

  stdout { 

#输出到标准输出(通常用于调试)。

    codec => rubydebug 

#使用rubydebug编码,以易读的格式显示事件内容

  } 

}

6.6、启动logstash

[yu@logstash tmp]$ logstash -f /usr/local/logstash-8.4.0/config/logstash.conf

6.7后台启动

[yu@logstash tmp]$ sudo nohup logstash -f /usr/local/logstash-8.4.0/config/logstash.conf &

6.8、开机自启动

[yu@logstash tmp]$ sudo echo "source /etc/profile" >> /etc/rc.local #让开机加载java环境

[yu@logstash tmp]$ sudo echo "nohup logstash -f /usr/local/logstash-8.4.0/config/logstash.conf &" >> /etc/rc.local

[yu@logstash tmp]$ sudo chmod +x /etc/rc.local

7、登录kibana网页查看索引生成情况生成数据视图

8、Zabbix与ELK整合实现对安全日志数据的实时监控告警

     有些时候,我们希望在收集日志的时候,能够将日志中的异常信息(警告、错误、失败等信息)及时的提取出来,因为日志中的异常信息意味着操作系统、应用程序可能存在故障,如果能将日志中的故障信息及时的告知运维人员,那么运维就可以第一时间去进行故障排查和处理,进而也就可以避免很多故障的发生。

     ELK(更确切的说应该是logstash)可以实时的读取日志的内容,并且还可以过滤日志信息,通过ELK的读取和过滤功能,就可以将日志中的一些异常关键字(error、failed、OutOff、Warning)过滤出来,然后通过logstash的zabbix插件将这个错误日志信息发送给zabbix,那么zabbix在接收到这个数据后,结合自身的机制,然后发起告警动作,这样就实现了日志异常zabbix实时告警的功能了。

8.1、Logstash与zabbix插件的使用

    Logstash支持多种输出介质,比如syslog、HTTP、TCP、elasticsearch、kafka等,而有时候我们想将收集到的日志中一些错误信息输出,并告警时,就用到了logstash-output-zabbix这个插件,此插件可以将Logstash与zabbix进行整合,也就是将Logstash收集到的数据进行过滤,将有错误标识的日志输出到zabbix中,最后通过zabbix的告警机制进行触发、告警。

   logstash-output-zabbix是一个社区维护的插件,它默认没有在Logstash中安装,但是安装起来也很容易,

8.1.1下载阿里源

[yu@logstash ~]$ sudo wget   -O   /etc/yum.repos.d/CentOS-Base.repo    http://mirrors.aliyun.com/repo/Centos-7.repo

8.1.2直接在logstash中运行如下命令即可:

[yu@logstash ~]$ logstash-plugin install logstash-output-zabbix

Using bundled JDK: /usr/local/logstash-8.4.0/jdk

Validating logstash-output-zabbix

Resolving mixin dependencies

Installing logstash-output-zabbix

Installation successful

列出目前已经安装的插件

[yu@logstash ~]$ logstash-plugin list

列出已安装的插件及版本信息

[yu@logstash ~]$ logstash-plugin list --verbose

8.2、logstash-output-zabbix插件的使用

logstash-output-zabbix安装好之后,就可以在logstash配置文件中使用了,下面是一个logstash-output-zabbix使用的例子:

zabbix {

        zabbix_host =>"[@metadata][zabbix_host]"

        zabbix_key =>"[@metadata][zabbix_key]"

        zabbix_server_host =>"x.x.x.x"

        zabbix_server_port =>"xxxx"

        zabbix_value ="xxxx"

        }

其中:

zabbix_host:表示Zabbix主机名字段名称, 可以是单独的一个字段, 也可以是 @metadata 字段的子字段, 是必需的设置,没有默认值。

zabbix_key:表示Zabbix项目键的值,也就是zabbix中的item,此字段可以是单独的一个字段, 也可以是 @metadata 字段的子字段,没有默认值。

zabbix_server_host:表示Zabbix服务器的IP或可解析主机名,默认值是 “localhost”,需要设置为zabbix server服务器所在的地址。

zabbix_server_port:表示Zabbix服务器开启的监听端口,默认值是10051。

zabbix_value:表示要发送给zabbix item监控项的值对应的字段名称,默认值是 “message”,也就是将”message”字段的内容发送给上面zabbix_key定义的zabbix item监控项,当然也可以指定一个具体的字段内容发送给zabbix item监控项。

8.3、将logstash与zabbix进行整合

这里我们以logstash收集日志,然后对日志进行读取,最后选择关键字进行过滤并调用zabbix告警的流程,来看看如何配置logstash实现zabbix告警。

先说明一下我们的应用需求:通过对系统日志文件的监控,然后去过滤日志信息中的一些关键字,例如ERROR、Failed、WARNING等,将日志中这些信息过滤出来,然后发送到zabbix上,最后借助zabbix的报警功能实现对系统日志中有上述关键字的告警。

对于过滤关键字,进行告警,不同的业务系统,可能关键字不尽相同,例如对http系统,可能需要过滤500、403、503等这些错误码,对于java相关的系统,可能需要过滤OutOfMemoryError、PermGen、Java heap等关键字。在某些业务系统的日志输出中,可能还有一些自定义的错误信息,那么这些也需要作为过滤关键字来使用。

8.3.1配置logstash事件配置文件

input { 

  kafka { 

    bootstrap_servers => "192.168.1.179:9092" 

    topics_pattern => "topic.*" 

    consumer_threads => 5 

    decorate_events => true 

    codec => plain { charset => "UTF-8" } 

    auto_offset_reset => "latest" 

    group_id => "logstash1" 

  } 

} 

filter { 

  # 移除不需要的字段 

  mutate { 

    remove_field => ["beat"] 

  } 

  # 使用grok来解析日志 

  grok { 

    match => { 

      "message" => "\[(?<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\] \[(?<level>\w+)\] (?<thread>[\w|-]+) (?<class>[\w|\.]+) (?<lineNum>\d+):(?<msg>.+)" 

    } 

    overwrite => ["message"] 

    tag_on_failure => ["_grokparsefailure"] 

  } 

  # 添加topic_name字段 

  if "[@metadata][kafka][topic]" { 

    mutate { 

      add_field => { "topic_name" => "%{[@metadata][kafka][topic]}" } 

    } 

  } 

  # 为Zabbix准备特定的字段 

  if [topic_name] { 

    mutate { 

      add_field => { "zabbix_topic" => "%{topic_name}" } 

      add_field => { "zabbix_level" => "%{level}" } 

      add_field => { "zabbix_message" => "%{msg}" } 

      # 如果需要,继续添加其他Zabbix需要的字段 

    } 

  } 

} 

output { 

  # 发送给Elasticsearch 

  if [topic_name] { 

    elasticsearch { 

      hosts => ["192.168.1.177:9200"] 

      index => "%{topic_name}-%{+YYYY.MM.dd}" 

    } 

  } 

  # 发送给Zabbix 

  if [zabbix_topic] and [zabbix_level] and [zabbix_message] { 

    zabbix { 

      zabbix_host => "your_zabbix_server_host" 

      zabbix_port => 10051 

      zabbix_sender_host => "logstash_host_name" 

      # 定义item key和对应的字段 

      item_key => { 

        "topic" => "%{zabbix_topic}" 

        "level" => "%{zabbix_level}" 

        "message" => "%{zabbix_message}" 

        # ... 其他键值对 ... 

      } 

      # 其他可选参数,比如zabbix_server等 

    } 

  } 

}

                        }

可以在一个服务器上同时启动多个logstash进程。但是,当同时启动多个logstash进程时,需要指定不同的path.data,否则会报错。例如,使用以下命令启动两个logstash进程:

./logstash -f /etc/logstash/config.d/xxx1.conf --path.data=/etc/logstash/data1/ & 

./logstash -f /etc/logstash/config.d/xxx2.conf --path.data=/etc/logstash/data2/ &

使用 ELK 收集日志 在这种情况下,ELK 为我们提供了统一的日志管理解决方案,它能很好的支持 Logback 等日志框架,使得我们可以集中的管理不同应用输出的日志信息。创建完成后,返回 Kibana 的首页,选择 Discover 选项,切换到我们新建的 logstash-* 选项下,然后选择时间段,就可以看到相应的日志信息了。在上图中应用日志框架直接将日志发送给 Logstash,然后 Logstash 将接收的日志写入 ElasticSearch 中,开发人员通过可视化的 Kibana 可以进行日志的查询和分析。 阅读详情

相关推荐

ELK日志收集系统简述

在每台服务器上部署logstash实例,对日志进行收集或处理后输出到elasticsearch、elasticsearc进行存储、索引,kibana关联索引,展示、分析数据,这种架构是常见的构架,缺点是在每台服务器上要部署logstash实例,而且还得依赖jdk,所以跑起来比较重,对资源消耗比较大,另外es是单个节点,存在单点故障,所以这种架构比较适合日志数据不大、机器少的场景.2、它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

wuds_158的博客 3502

Kafka 概述、Filebeat+Kafka+ELK

Kafka 是一个分布式的基于发布/订阅模式的消息队列(MQ,Message Queue),主要应用于大数据领域的实时计算以及日志收集。

Axic123的博客 2630

【教你通透ELK】elk 自定义日志采集

(1)Logstash:Logstash 是一个开源的数据收集引擎,它可以从各种来源收集数据,如日志文件、TCP/UDP、JMX 等,然后将数据转换为统一的格式,并将其发送到 Elasticsearch 或其他目的地。(2)Elasticsearch:Elasticsearch 是一个分布式的搜索和分析引擎,它可以存储和索引大量的数据,并提供实时的搜索和分析功能。(1)配置 Logstash:在 Logstash 中配置输入插件、过滤器插件和输出插件,以定义日志数据的采集、处理和存储方式。

走向CTO的路上... 1082

Filebeat与Kafka初步了解

最近刚开始学习中间件,对于其中理解有误的地方,望各位大侠指正,相互学习。 Filebeat Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息到MQ中间件,或者直接到elasticsearch或者logstarsh中存放。 工作流程: 1、 filebeat启动一个或...

代码使我快乐 3373

OAI数据集申请与实战:从权限获取到医学影像分析应用

本文详细介绍了OAI数据集的申请流程与医学影像分析实战应用。从NDA账户注册、数据下载技巧到骨盆X光关键点检测的完整实现,帮助医学研究者高效利用这一权威骨关节炎数据集。特别分享使用Pei Y标注数据训练U-Net模型的经验,包括预处理、注意力机制优化等实用技巧。

weixin_30275415的博客 478

Pytorch版deeplabv3+环境配置训练自己的数据集

参考:https://blog.youkuaiyun.com/qq_36766560/article/details/110009622?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161594607816780266214828%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161594607816780266214828

Ring__Rain的博客 1万+

ELK+Filebeat+Kafka+Zookeeper日志分析系统搭建

Filebeat由两个主要组成部分组成:prospector(探勘者)和 harvesters(矿车)。这些组件一起工作来读取文件并将事件数据发送到指定的output。1、prospector: 负责找到所有需要进行读取的数据源2、harvesters:负责读取单个文件的内容,并将内容发送到output中,负责文件的打开和关闭。作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给 Elasticsearch。轻量级的开源日志

weixin_56270746的博客 2813

ROS智能车定位导航仿真+功能包自带的地图实现+自己建立的地图实现

ROS智能车定位导航仿真一、前言二、效果图三、准备工作[1.在Ubuntu上安装ROS Kinetic](https://blog.youkuaiyun.com/qq_42585108/article/details/104327661)2.创建ROS工作区间①1创建racecar_ws和src文件夹②初始化工作空间③下载racecar源代码包,并编译工程四、启动仿真1.设置环境变量2.启动地图五、建图1.启动slam和rviz2 控制车辆(左侧有个控制窗口),WASD控制前左后右的运动就可以建图了:3.新建终端保存地

qq_42585108的博客 1万+

ELK学习笔记之配置logstash消费kafka多个topic并分别生成索引

0x00filebeat配置多个topic filebeat.prospectors: - input_type: log encoding: GB2312 # fields_under_root: true fields: ##添加字段 serverip: 192.168.1.10 logtopic: wap enable...

dengxiangbao3167的博客 2322

将Python爬取的数据导入钉钉多维表

摘要:本文介绍将Python爬取的数据导入钉钉多维表的完整解决方案。首先通过requests库爬取数据并解析为结构化格式,然后使用钉钉开放平台API对接多维表。关键步骤包括获取app_key、app_secret等凭证,通过OAuth2获取access_token,以及批量写入记录。文章详细说明了参数获取位置、字段类型匹配、权限配置等注意事项,并提供了错误处理建议和性能优化方法。适用于需要将网络数据同步到钉钉多维表的开发场景。

IT深耕十余载,大道之简 2130

adams案例分析_案例1(麦弗逊悬架子系统创建)

本文字数3292字83图,建议阅读时间26分钟首先看下案例1的麦弗逊悬架数模结构就不细讲了,从数模上主要是获取硬点坐标(铰接点、安装点、参考点)及大部件结构(副车架、摆臂、转向节等实际运动过程中会产生变形的部件,在ADAMS Car中我们就可以用柔性体来搭建)再来回顾下上一篇讲到的模型元素1、Hardpoint——硬点(只有位置没有方向)2、Parameter Variable——参数...

weixin_39609407的博客 6475

【Filebeat+Kafka+ELK企业级日志系统实战部署:详解Kafka、Filebeat核心知识与ELK集成场景,Kafka集群部署、组件配置与验证,Filebeat部署及Kibana可视化】

本文介绍在ELK系统中加入Kafka和Filebeat的部署方案。Kafka作为高吞吐量消息队列,实现日志缓冲和削峰填谷;Filebeat作为轻量级日志采集工具,负责实时采集并转发日志至Kafka。文章包含基础知识讲解、适用场景分析及详细部署步骤,通过Nginx日志收集案例,演示如何构建高可用日志处理系统。部署架构采用分布式设计,包含3节点Kafka集群,支持横向扩展,适用于大流量日志场景。

m0_63756214的博客 1463

使用openclaw出现blocked URL fetch (url-fetch) reason=Blocked: resolves to private/internal/special 解决方案

本文主要介绍了使用openclaw出现blocked URL fetch (url-fetch) target=https://news.google.com/search reason=Blocked: resolves to private/internal/special-use IP address 解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

ELK+Filebeat+Kafka+Zookeeper安装部署

本文详细讲解如何在三节点集群中部署ZooKeeper与Kafka分布式系统,并集成Filebeat实现Nginx日志实时采集。内容涵盖:ZooKeeper集群搭建:包括安装、配置文件优化、节点ID分配及状态监控;​Kafka集群配置:环境变量设置、Topic管理(创建/查看/删除)、生产者与消费者测试;​数据采集实战:通过Filebeat收集Nginx结构化日志并推送至Kafka,支持高吞吐量数据处理;​全流程验证:从日志格式化到Kafka消息收发,确保数据链路畅通。适用于需要构建实时日志分析消息队列分布式

qq_63926306的博客 1146

AppStore逆向分析(登录、查询、下单)

某网站全协议流程逆向与分析(自动登录、激活、查询、下单)

吴秋霖的博客 3026

ABAP Channels 实战:在 ABAP 7.40 中用 WebSocket 打造实时双向通信

本文详细介绍了SAP ABAP 7.40引入的ABAP Channels通信框架,包含AMC(ABAP Messaging Channels)和APC(ABAP Push Channels)两部分。AMC作为应用服务器内部的消息总线,支持发布/订阅模式,可实现跨会话实时通信;APC基于WebSocket协议,用于浏览器等客户端与ABAP服务器的双向实时交互。文章通过一个乒乓球游戏案例展示了ABAP Channels的实时协作能力,并详细解析了AMC的配置方法、消息发送与接收的代码实现,帮助开发者理解如何利用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 220

ELK+Filebeat+Kafka+ZooKeeper构建大数据日志分析平台

配置elasticsearch集群,除此处配置外,其他Elasticsearch节点均相同。配置logstash作为转发节点,获取kafka中日志,存储至elasticsearch中。验证数据是否发送至Elasticsearch,需要安装Kibana,安装后验证。配置kafka,除此项外,其他配置各节点均相同。启动Logstash服务,验证数据传递效果。解压Elasticsearch安装包。修改输入插件配置,从文件中读取信息。解压ZooKeeper安装包。解压Filebeat安装包。配置Filebeat。

m0_50978391的博客 1294

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ELK-收集nginx日志

前面已经搭建好了ELK的基础环境,现在我们可以开始收集日志了,那就从收集nginx日志开始吧。 一、把nginx日志json化 收集nginx日志之前,最好是把nginx的日志格式给json化,这样可以大大的方便我们收集和查看日志。 修改nginx的配置文件,增加json日志格式。 log_format access_json '{"clientip":"$remote_addr",' ...

嘻哈王大头 1006

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ELK日志收集部署简单说明

在项目中用到了ELK进行日志收集。本文简单梳理一下ELK部署流程,因为资源限制和技术水平有限,参考了很多其它博客(也用了其中一些图),仅供参考。 一、系统总体架构 构件说明 Filebeat:轻量级数据收集引擎,可以高效地从服务器收集数据并将数据推送到指定的输出上。支持多种输入数据源和输出方式。 Kafka:数据缓冲队列。有效地防止系统因为负荷过大而崩溃。 ...

TenSonLee的博客 580

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Filebeat日志采集与ELK+Kafka缓冲架构部署

本文摘要: 文章分为三部分:1)Filebeat采集Elasticsearch集群日志,包括部署流程、配置要点(如模块启用、内存锁定)及节点稳定性优化;2)ELK+Kafka日志缓冲架构部署,详细说明Kafka集群配置(KRaft模式)、Filebeat输出到Kafka的调整,以及Logstash数据处理流程;3)总结常见问题,如Filebeat格式错误、Kafka集群ID一致性、网络配置校验等。关键点包括多节点日志统一采集、Kafka高可用配置(分区/副本)、日志结构化处理(Grok)及全链路调试方法

2301_80847288的博客 189

分布式运用之Filebeat+Kafka+ELK 的服务部署

kafka工作流程 ack应答机制 filebeat+kafka

zhangchang3的博客 1431

filebeat-kafka-elk搭建

本文档搭建filebeat、kafka、elk、的日志采集、流传输、解析、存储、可视化系统。 一.说明 1.k8s的pod(容器)挂载volumes,将容器内数据持久化到宿主机的磁盘目录。 2.filebeat监控宿主机上的目录,采集生产日志数据。 3.kafka消息队列传输日志数据,创建topic,用来存放数据。 4.logstash消费kaf...

300

SpringBoot+Kafka+ELK 海量日志收集

整体流程大概如下: 服务器准备 在这先列出各服务器节点,方便同学们在下文中对照节点查看相应内容 SpringBoot项目准备 引入log4j2替换SpringBoot默认log,demo项目结构如下: pom <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spri...

Pastxu的小屋 238

ELK 企业实战7

注:以下为环境所需所有服务器,配置为测试环境配置。安装软件主机名IP地址系统版本配置Elk2核4GEs12核3GEs22核3GKafka11核2GKafka21核2GKafka31核2GFilebeat。

2301_77428746的博客 1019
上一篇: jenkins-pipeline语法详解 最新最全 (声明式Pipeline和脚本式)
下一篇: jenkins+ SonarQube(代码质量测试)从gitlab拉取若依代码进行检测
zero_open
博客等级 码龄3年 168粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值