利用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中也有數據了。

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