前言
接到任务是,需要从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)直接用官网的云安装方式,如果不想访问官网的,我直接简化下操作步骤:
- 下载与安装公共签名地址:
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
- 进入目录*/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
- 执行下载并安装(大概150多M):
sudo yum install logstash
kafka 安装
网盘地址: https://pan.baidu.com/s/1ONdAOFJvSqvl9Mh00ghh0A 提取码: ksnk
或者CSDN下载地址:点击下载
- 上传 kafka_2.11-0.10.2.0.tgz 压缩包至/usr目录
- 解压 tar zxvf kafka_2.11-0.10.2.0.tgz 压缩包至当前目录
- 设置环境变量
vim /etc/profile
#Kafka Env
export KAFKA_HOME=/usr/kafka_2.11-0.10.2.0
export PATH=$PATH:$KAFKA_HOME/bin
- 退出vim编辑器,使环境变量设置立即生效
source /etc/profile
- 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的端口 |
- 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服务的超时时间。单位是毫秒 |
- 因为是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"
}
}
上面配置说明:
- input 这里监控 目前 /usr/share/logstash/data/info_*.log 下所有匹配的文件。
- filter 使用grok 来匹配出各个参数的值,我本文的需求主要是截取日志中的json数据。
- 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中也有数据了。