利用logstash截取日志中的数据并推送至Kafka

前言

接到任务是,需要从web日志中取出设备的操作信息,并推送kafka。领导要求使用logstash,要评估技术可行性。我这边就在自己的机器上,逐步安装logstash,kafka并进行相关的调试安装与试运行。
附我们日志的数据案例:

2020-06-09 09:44:32,852 [http-nio-8088-exec-3] 13517 INFO - method=com.vatti.recipe.service.impl.CookingRecipeServiceImpl.addLog |–| info=cookingLog |–| data={“deviceType”:“蒸烤一体机”,“recipeName”:“时蔬烤肉串”,“appUser”:“Sopor2o13”,“cookingTime”:“2020-06-09 09:44:32”,“recipeId”:“70”}

logstash 安装

可以下载tar等进行解压然后配置运行。我这边为了方便(系统是Centos)直接用官网的云安装方式,如果不想访问官网的,我直接简化下操作步骤:

  1. 下载与安装公共签名地址:
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
  1. 进入目录*/etc/yum.repos.d/* 创建文件:logstash.repo,内容如下:
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
  1. 执行下载并安装(大概150多M):
sudo yum install logstash

kafka 安装

网盘地址: https://pan.baidu.com/s/1ONdAOFJvSqvl9Mh00ghh0A 提取码: ksnk
或者CSDN下载地址:点击下载

  1. 上传 kafka_2.11-0.10.2.0.tgz 压缩包至/usr目录
  2. 解压 tar zxvf kafka_2.11-0.10.2.0.tgz 压缩包至当前目录
  3. 设置环境变量
vim /etc/profile
#Kafka Env
export KAFKA_HOME=/usr/kafka_2.11-0.10.2.0
export PATH=$PATH:$KAFKA_HOME/bin
  1. 退出vim编辑器,使环境变量设置立即生效
source /etc/profile
  1. zookeeper配置
vim /usr/kafka_2.11-0.10.2.0/config/zookeeper.properties 

我这边使用了默认配置,端口默认2181,data地址为/tmp/data

配置项 配置项的值 说明
dataDir /usr/kafka_2.11-0.10.2.0/zookeeper zookeeper的数据存储目录
clientPort 2181 客户端连接zookeeper的端口
  1. server配置
vim /usr/kafka_2.11-0.10.2.0/config/server.properties

我这边也是按默认的来,没做改动。
配置项说明:

配置项 配置项的值 说明
port 9092 端口号
host.name 10.10.10.21 服务器本机地址
zookeeper.connect localhost:2181 zookeeper地址和端口,单机配置部署,localhost:2181
log.dirs /usr/kafka_2.11-0.10.2.0/log/kafka 日志存放路径,上面创建的目录
zookeeper.connection.timeout.ms 1000000 连接zookeeper服务的超时时间。单位是毫秒
  1. 因为是demo,使用的是我个人的机器,内存比较小,所以把zk的启动内存,以及logstash的启动内存都调小:
    zk:
vim /usr/kafka_2.11-0.10.2.0/bin/zookeeper-server-start.sh

变更内容:

export KAFKA_HEAP_OPTS="-Xmx256M -Xms256M"

kafka:

vim /usr/kafka_2.11-0.10.2.0/bin/kafka-server-start.sh

变更内容:

export KAFKA_HEAP_OPTS="-Xmx256M -Xms256M"

关闭防火墙

检查防火墙状态

systemctl status firewalld.service
service iptables status

若防火墙running,关闭防火墙

systemctl stop firewalld
service iptables stop

启动zk与kafka

启动zookeeper:

/usr/kafka_2.11-0.10.2.0/bin/zookeeper-server-start.sh /usr/kafka_2.11-0.10.2.0/config/zookeeper.properties

启动kafka server:

/usr/kafka_2.11-0.10.2.0/bin/kafka-server-start.sh /usr/kafka_2.11-0.10.2.0/config/server.properties

创建topic

kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

启动消费者

kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning

配置logstash

cd /etc/logstash/
touch logstash.conf
vim logstash.conf
input {
  file {
        path => ["/usr/share/logstash/data/info_*.log"]
        type => "log"
        start_position => "beginning"
    }
}

filter {
  grok {
	# 筛选过滤
	match => {
	   "message" => "(?<date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3}) \[%{DATA:current_thread}\] %{DATA:pid} %{LOGLEVEL:level}\s*\- %{WORD}\=(?<method>([\S+]*)) \|\-\-\| %{WORD}\=%{DATA:info} \|\-\-\| %{WORD}\=%{GREEDYDATA:data}"
	}
   remove_field => ['@timestamp', '@version','host','path'] 
 }
 # 不匹配正则则删除,匹配正则用=~
 if [info] != "cookingLog" {
	 # 删除日志
	 drop {}
 }
}

output {
  stdout {
	codec => rubydebug
  }
  kafka {
    bootstrap_servers => "127.0.0.1:9092"
    codec => plain {
            format => "%{data}"
        }
    topic_id => "test"
  }
}

上面配置说明:

  1. input 这里监控 目前 /usr/share/logstash/data/info_*.log 下所有匹配的文件。
  2. filter 使用grok 来匹配出各个参数的值,我本文的需求主要是截取日志中的json数据。
  3. output 输出到控制台以及本地kafka的配置。

启动logstash

logstash -f /etc/logstash/logstash.conf --config.test_and_exit

测试

cd /usr/share/logstash/data/
touch info_20200610_01.log
cat >> info_20200610_01.log

输入内容按回车:

2020-06-09 09:44:32,852 [http-nio-8088-exec-3] 13517 INFO  - method=com.vatti.recipe.service.impl.CookingRecipeServiceImpl.addLog |--| info=cookingLog |--| data={"deviceType":"蒸烤一体机","recipeName":"时蔬烤肉串","appUser":"Sopor2o13","cookingTime":"2020-06-09 09:44:32","recipeId":"70"}

可以看到各端的日志输出,kafka中也有数据了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章