前言
接到任務是,需要從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中也有數據了。